加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

java Socket TCP通信实例

(2013-10-27 19:11:02)
分类: 计算机相关

java提供了URL类和URLConnection类来在一个相对比较高的层次上进行网络通信,以实现对Internet网络资源的访问。在各种网络服务器应用程序以及特殊协议应用在客户与服务器之间使用的通信组件内底层的核心通信机制都是使用传输层的接口的Socket机制来通信的。

用户使用Socket套接字一般有两个通信协议可供选择TCP和UDP。

TCP socket 建立应用程序间通信需要:

1.创建Socket,分别包括创建Socket对象和ServerSocket对象。

2.打开连接到Socket的输入输出流。Socket对象使用connect()方法发送请求,ServerSocket对象可用accept()方法来接受建立连接。

3.通过输入输出流进行读写操作。

4.关闭socket连接。使用close()方法。

例子:TCP服务器端程序:

package TCPSocket;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class Server extends JFrame{
 private static final long serialVersionUID=1L;
 private JTextArea enterArea;
 private JTextArea displayArea;
 private JButton sendButton;
 private Box box;
 private ObjectOutputStream output;
 private ObjectInputStream input;
 private ServerSocket server;
 private Socket connection;
 private int counter=1;
 
 public Server() {
  super("Server");
  Container container=getContentPane();
  enterArea =new JTextArea();
  enterArea.setEnabled(false);
  sendButton=new JButton("Send");
  sendButton.setEnabled(false);
  sendButton.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
   if(enterArea.getText().equals("")){
    JOptionPane.showMessageDialog(Server.this, "Warning! The sending content should not be empty!","Warning",JOptionPane.WARNING_MESSAGE);
    return;
   }
   else {
    sendData(enterArea.getText());
    enterArea.setText("");
   }
   }
  });
  displayArea=new JTextArea();
  displayArea.setBorder(BorderFactory.createLineBorder(Color.black));
  displayArea.setFont(new Font("Serif",Font.BOLD,14));
  displayArea.setForeground(Color.BLUE);
  displayArea.setEnabled(true);
  container.add(Box.createRigidArea(new Dimension(0,30)),BorderLayout.NORTH);
  container.add(new JScrollPane(displayArea),BorderLayout.CENTER);
  box=Box.createHorizontalBox();
  box.setBorder(BorderFactory.createTitledBorder("Enter Message!"));
  box.add(new JScrollPane(enterArea));
  box.add(sendButton);
  container.add(box,BorderLayout.SOUTH);
  setSize(500,300);
  setVisible(true);
 }
 public void run(){
  try {
   server=new ServerSocket(5555,100);
   while(true){
    waitForConnection();
    getStream();
    processConnection();
    closeConnection();
    ++counter;
   }
  } catch (EOFException e) {
   System.out.println("Client terminated connection!");
   // TODO: handle exception
  }catch (IOException e) {
   e.printStackTrace();
   // TODO: handle exception
  }
 }
 private void waitForConnection() throws IOException {
  displayArea.setText("Waiting for connection...\n");
  connection =server.accept();
  displayArea.append("Connection"+counter+"received from"+connection.getInetAddress().getHostName());
  enterArea.setEnabled(true);
  sendButton.setEnabled(true);
 }
 
 private void getStream() throws IOException {
  output=new ObjectOutputStream(connection.getOutputStream());
  output.flush();
  input=new ObjectInputStream(connection.getInputStream());
 }
 private void processConnection() throws IOException{
  String message="SERVER>>> connection successful";
  output.writeObject(message);
  output.flush();
  do {
   try {
    message=(String)input.readObject();
    displayArea.append("\n"+message);
    displayArea.setCaretPosition(displayArea.getText().length());
   } catch (ClassNotFoundException e) {
    displayArea.append("\nUnknown object type was received!");
    // TODO: handle exception
   }
  } while (!message.equals("CLENT>>>terminate"));
 }
 private void closeConnection() throws IOException{
  displayArea.append("\nUser terminatedd connection.");
  enterArea.setEnabled(false);
  sendButton.setEnabled(false);
  output.close();
  input.close();
  connection.close();
 }
 
 private void sendData(String message){
  try {
   output.writeObject("SERVER>>>"+message);
   output.flush();
   displayArea.append("\nSERVER>>>"+message);
  } catch (IOException e) {
   displayArea.append("\nError when writing object!");
   // TODO: handle exception
  }
 }
  public static void main (String args[]){
   Server server=new Server();
   server.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   server.run();
  }
 
}
客户端程序:

package TCPSocket;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class Client extends JFrame {
 private static final long serialVersionUID=1L;
 private JTextArea enterArea;
 private JTextArea displayArea;
 private JButton sendButton;
 private Box box;
 private ObjectOutputStream output;
 private ObjectInputStream input;
 private String message="";
 private String chatserver;
 private Socket client;
 public Client(String host){
  super("Client");
  chatserver=host;
  Container container=getContentPane();
  enterArea=new JTextArea();
  enterArea.setEnabled(false);
  sendButton=new JButton("send");
  sendButton.addActionListener(new ActionListener() {
   
   @Override
   public void actionPerformed(ActionEvent event) {
    // TODO Auto-generated method stub
    if(enterArea.getText().equals("")){
     JOptionPane.showMessageDialog(Client.this, "Warning! The sending content shouldn't empty!","Waring",JOptionPane.WARNING_MESSAGE);
     return;
    }
    else {
     sendData(enterArea.getText());
     enterArea.setText("");
    }
   }
  });
  displayArea=new JTextArea();
  displayArea.setBorder(BorderFactory.createLineBorder(Color.black));
  displayArea.setFont(new Font("Serif",Font.BOLD,14));
  displayArea.setForeground(Color.BLUE);
  container.add(Box.createRigidArea(new Dimension(0,30)),BorderLayout.NORTH);
  container.add(new JScrollPane(displayArea),BorderLayout.CENTER);
  box=Box.createHorizontalBox();
  box.setBorder(BorderFactory.createTitledBorder("Enter message"));
  box.add(new JScrollPane(enterArea));
  box.add(sendButton);
  container.add(box, BorderLayout.SOUTH);
  setSize(500,300);
  setVisible(true);
 }
 public void run(){
  try {
   connect();//set linkage
   getStreams();//get stream object
   processConnection();//change message
   closeConnection();//close linkage
  } catch (EOFException e) {
   // TODO: handle exception
   System.out.println("Server ternimated connection");
  }catch (IOException e) {
   // TODO: handle exception
   e.printStackTrace();
  }
 }
 private void connect(){
  displayArea.setText("Attempting a connection...\n");
  try {
   client=new Socket(InetAddress.getByName(chatserver),5555);
  } catch (Exception e) {
   // TODO: handle exception
   System.out.println(e.toString());
   System.exit(1);
  }
  displayArea.append("Conneted to:"+client.getInetAddress().getHostName());
 }
 private void getStreams() throws IOException{
  output=new ObjectOutputStream(client.getOutputStream());
  output.flush();
  input=new ObjectInputStream(client.getInputStream());
 }
 private void processConnection() throws IOException{
  enterArea.setEnabled(true);
  do{
   try {
    message=(String)input.readObject();
    displayArea.append("\n"+message);
    displayArea.setCaretPosition(displayArea.getText().length());
    }
   catch (Exception e) {
    // TODO: handle exception
    displayArea.append("\n unknown object type received.");
   }
  } while(!message.equals("SERVER>>>terminate"));
 }
 private void closeConnection() throws IOException{
  displayArea.append("\nServer terminated connection.");
  enterArea.setEnabled(false);
  sendButton.setEnabled(false);
  output.close();
  input.close();
  client.close();
 }
 private void sendData(String message){
  try {
   output.writeObject("CLIENT>>>"+message);
   output.flush();
   displayArea.append("\nCLIENT>>>"+message);
  } catch (Exception e) {
   // TODO: handle exception
   displayArea.append("\nError writing Object.");
  }
 }
 public static void main(String args[]){
  Client client;
  if(args.length==0){
   client=new Client("127.0.0.1");
  } else{
   client=new Client(args[0]);
  }
  client.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  client.run();
 }
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有