Java单线程聊天室
#define微光 人气:0一. Socket API简介
1. Socket编程
Java.net.Socket类代表一个套接字,并且为服务器程序提供了一种来监听客户端并与他们建立连接的一种机制.
套接字使用TCP提供了两台计算机之间的通信机制,客户端创建一个套接字并尝试连接服务器的套接字,当连接建立时,服务器就会创建一个Socket对象,客户端和服务器就可以通过Socket对象的写入和读取来进行通信,这就是聊天室的原理.
两台计算机使用套接字建立TCP连接时会出现以下步骤:
- 服务端实例化一个ServerSocket对象,表示通过服务器上的端口通信
- 服务端调用ServerSocket的accept()方法,该方法将一直等待,直到客户端连接上服务器上给定的端口
- 服务端正在等待时,一个客户端实例化一个Socket对象,指定服务器名称和端口号来请求连接
- Socket类的构造函数试图将客户端连接到指定的服务器和端口号上,如果通信被建立,则在客户端创建一个Socket对象能够与服务端进行通信
- 在服务端,accept()方法返回服务器上一个新的socket引用,该socket连接到客户端的socket
TCP是一个双向通信协议,连接建立后,通过使用I/O流进行通信,每一个socket都有一个输出流和输入流,客户端的输出流连接到服务端的输入流,服务端的输出流连接到客户端的输入流.
二. 实现单线程模式的聊天室
首先我们来理清整个编程的思路:
socket编程
1.创建项目:
1.1 服务器模块ServerSocket
1.2 客户端模块Socket
2. 服务器端
2.1 创建serverScoket,绑定端口
2.2 接收客户端连接,Socket
2.3 通过Socket连接,发送和接收数据
2.4 关闭ServerSocket/Socket
3. 客户端
3.1 创建Socket,指定服务器的地址和端口号
3.2 通过Socket发送和接收数据
3.3 关闭Socket
1. 服务端
package single; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; /** * Author:weiwei * description:单线程聊天室服务端 * Creat:2019/3/8 **/ public class singleThreadserver { public static void main(String[] args) { try { //1. 创建服务端ServerSocket,监听6666端口 ServerSocket serverSocket = new ServerSocket(6666); System.out.println("服务器启动..."+serverSocket. getLocalSocketAddress()); //服务器启动,打印当前地址 //2. 接收客户端连接 Socket socket = serverSocket.accept(); //调用accept()方法 System.out.println("接收到客户端连接..."+socket. getRemoteSocketAddress()); //接收远程客户端 //3. 接收和发送数据 //3.1 接收数据 InputStream inputStream = socket.getInputStream(); //获取字节流 Scanner scanner = new Scanner(inputStream); //字节流转字符流 String message = scanner.nextLine(); //读数据,按行读,读一行 System.out.println("收到客户端的消息:"+message); //打印接收到的消息 //3.2 发送数据 OutputStream outputStream = socket.getOutputStream(); //获取字节流 OutputStreamWriter writer = new OutputStreamWriter(outputStream);//字节流转字符流 writer.write("你好,客户端,我很好.\n"); //写数据 writer.flush(); //刷新(网通信) //4. 关闭 serverSocket.close(); System.out.println("服务器关闭"); } catch (IOException e) { e.printStackTrace(); } } }
2. 客户端
package single; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.Socket; import java.util.Scanner; /** * Author:weiwei * description:单线程聊天室客户端 * Creat:2019/3/8 **/ public class singleThreadclient { public static void main(String[] args) { try { //1. 创建Socket客户端,连接指定服务地址和端口号 Socket socket = new Socket("127.0.0.1",6666); System.out.println("客户端创建..."+socket. getLocalSocketAddress()); //客户端创建,打印当前地址 //2. Socket发送和接收数据 //2.1 发送数据 OutputStream outputStream = socket.getOutputStream(); //获取字节流 OutputStreamWriter writer = new OutputStreamWriter(outputStream); //字节流转字符流 writer.write("你好,服务器.\n"); //写数据 writer.flush(); //刷新 //2.2 接收数据 InputStream inputStream = socket.getInputStream(); //获取字节流 Scanner scanner = new Scanner(inputStream); //字节流转字符流 String message = scanner.nextLine(); //读数据,按行读 System.out.println("接收到服务器的消息:"+message); //打印接收到的数据 //3. 关闭 socket.close(); System.out.println("客户端关闭"); } catch (IOException e) { e.printStackTrace(); } } }
加载全部内容