可以理解为socket是用来读写的一个对象(双全工)
服务器和客户端都各自有一个,这也对应了,TCP四次挥手。
服务器端
package Single;
import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server {
public static void main(String[] args) throws IOException {
//建立基站
ServerSocket serverSocket = new ServerSocket(666);
System.out.println("等待客户端连接……");
//accept会返回一个socket用来读写数据
Socket socket = serverSocket.accept();
//建立连接后,建立数据输入输出
//打印发送的数据
PrintStream printStream = new PrintStream
(socket.getOutputStream(),true,"UTF-8");
printStream.println("Hi~i am server!");
//打印收到的数据
Scanner scanner = new Scanner(socket.getInputStream());
if(scanner.hasNext()){
System.out.println("Client:"+scanner.nextLine());
}
//关闭流
scanner.close();
printStream.close();
socket.close();
}
}
客户端
package Single;
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws IOException {
//建立连接
Socket socket = new Socket("127.0.0.1",666);
//打印接收到的数据
Scanner scanner = new Scanner(socket.getInputStream());
if(scanner.hasNext()){
System.out.println("Server:"+scanner.nextLine());
}
//发数据
PrintStream printStream = new PrintStream(socket.getOutputStream(),true,
"UTF-8");
printStream.println("hi~,i am client");
socket.close();
scanner.close();
printStream.close();
}
}
结果:
1.先执行server端,ServerSocket.accept(),返回一个Socket对象,用于读写数据,并处于等待客户端连接状态
2.再执行client,连接服务器的Host和port,连接成功,client收到server发来的连接成功消息(ACK)。
3.再看这时候的server端,收到client的消息(ACK)
优化
上面也看到了,这个只是聊天室的一个雏形,它不能完成正常的通信,只能在连接的时候给服务器发送一句话就断开链接了。
所以列几个可以优化的点下篇博客进行详解:
1.服务器实现多线程
2.使用while一直保持通讯状态
3.可以指定收信人,也就是私聊
4.可以群发给列表好友
5.实现写操作的时候同时可以接收到消息,也就是把客户端的读写线程分开,互不干涉。