1.概述
通过ServerSocket与Socket实现的TCP的通信,这个例子配合了swing使用,其实作者之前发过一篇ServerSocker与Socket的通信,在这里,这边文章就是在这个例子上修改而成的.
其实原理很简单的,就是一个服务端一个客户端,服务端这边创建好ServerSocket后,使用accept()堵塞一直等待客户端发送socket.
好吧,不废话了.进正题.
2.服务端
swing的部分就不说了,说一下主要操作.
(1)新建ServerSocket
1ServerSocket serverSocket = null; 2serverSocket = new ServerSocket(12345);//一个不被占用的端口即可
构造方法的参数是端口,默认使用本地ip. ServerSocket有三个构造方法.
1ServerSocket(int port); 2ServerSocket(int port,int backlog); 3ServerSocker(int poer,int backlog,InetAddress ip);
(2)接收socket
Socket socket = serverSocket.accept();
返回一个Socket(),会一直等待,处于阻塞状态. 一般设置一个while(true)循环接收.
(3)数据处理
使用DataInputStream与DataOutputStream:
1DataInputStream inputStream = new DataInputStream(socket.getInputStream()); 2DataOutputStram outputStream = new DataOutputStream(socket.getOutputStream());
然后使用read与write方法即可. 注意关闭的时候要等输入输出完成后再一起关闭,就是说,不能这样:
1DataInputStream inputStream = new DataInputStream(socket.getInputStream()); 2String data = inputStream.readUTF(); 3inputStream.close(); 4DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream()); 5outputStream.writeUTF("ok"); 6outputStream.close();
这样的话getInputStream()没有问题,但是到了getOutputStream()的时候就有问题了,会提示异常:
Socket is closed. 所以解决办法就是等输出完之后再一起关闭:
1DataInputStream inputStream = new DataInputStream(socket.getInputStream()); 2String data = inputStream.readUTF(); 3DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream()); 4outputStream.writeUTF("ok"); 5inputStream.close();//等输出完成后再关闭 6outputStream.close();
(4)完整代码Server.java
1import java.io.DataInputStream; 2import java.io.DataOutputStream; 3import java.io.IOException; 4import java.net.InetAddress; 5import java.net.ServerSocket; 6import java.net.Socket; 7import javax.swing.*; 8 9public class Server { 10 public static void main(String[] args) 11 { 12 JFrame frame = new JFrame("Server"); 13 JPanel panel = new JPanel(); 14 JTextArea text = new JTextArea(); 15 16 panel.add(text); 17 frame.setContentPane(panel); 18 frame.setSize(600, 300); 19 frame.setLocationRelativeTo(null); 20 frame.setVisible(true); 21 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 22 23 ServerSocket serverSocket = null; 24 try 25 { 26 serverSocket = new ServerSocket(12345); 27 while (true) 28 { 29 Socket socket = serverSocket.accept(); 30 DataInputStream inputStream = new DataInputStream(socket.getInputStream()); 31 text.setText(inputStream.readUTF()); 32 33 DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream()); 34 outputStream.writeUTF("ok"); 35 inputStream.close(); 36 outputStream.close(); 37 socket.close(); 38 } 39 } 40 catch (IOException e) 41 { 42 e.printStackTrace(); 43 } 44 finally 45 { 46 try 47 { 48 serverSocket.close(); 49 } 50 catch (IOException e) 51 { 52 e.printStackTrace(); 53 } 54 } 55 } 56}
3.客户端
客户端的操作就是开启一个Socket,再通过这个socket获取对应的输入输出流就可以了.
(1)新建一个Socket
Socket socket = new Socket("127.0.0.1",12345);//这个端口与服务端的端口对应
Socket有三个构造方法:
1Socket(InetAddress ip,int port); 2Socket(String ip,int port); 3Socket(InetAddress ip,int port,InetAddress localIp,int localPort); 4Socket(String ip,int port,InetAddress localIp,int localPort);
(2)输入输出
同样使用DataInputStream与DataOutputStream:
1DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream()); 2DataInputStream inputStream = new DataInputStream(socket.getInputStream());
(3)完整代码Client.java
1import java.io.DataInputStream; 2import java.io.DataOutputStream; 3import java.io.IOException; 4import java.net.Socket; 5 6import javax.swing.*; 7import java.awt.GridLayout; 8public class Client 9{ 10 public static void main(String[] args) { 11 JFrame frame = new JFrame(); 12 JTextArea text = new JTextArea(); 13 JButton send = new JButton(); 14 GridLayout layout = new GridLayout(2, 1, 0, 5); 15 16 frame.setTitle("Client"); 17 frame.setVisible(true); 18 frame.setLocationRelativeTo(null); 19 frame.setSize(600, 300); 20 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 21 frame.setLayout(layout); 22 23 frame.add(text); 24 frame.add(send); 25 send.setText("send"); 26 send.addActionListener(v -> 27 { 28 try 29 { 30 String host = "127.0.0.1"; 31 int port = 12345; 32 Socket socket = new Socket(host, port); 33 DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream()); 34 outputStream.writeUTF(text.getText()); 35 36 DataInputStream inputStream = new DataInputStream(socket.getInputStream()); 37 text.setText(inputStream.readUTF()); 38 outputStream.close(); 39 inputStream.close(); 40 socket.close(); 41 } 42 catch (IOException e) 43 { 44 e.printStackTrace(); 45 } 46 }); 47 } 48}
4.测试
先开启服务端,再开启客户端,这里设置了服务端返回给客户端的信息为"ok". 