文章目录
在实现网络聊天室之前,首先我们应该了解一下关于网络中的Socket编程
1.关于Socket编程
服务端Socket类 :ServerSocket
客户端Socket类 :Socket
1.1 服务端Socket类 :ServerSocket
- 传入端口号,建立服务端Socket等待客户连接,通过构造方法建立基站
ServerSocket server = new ServerSocket(port);
为什么要有端口号?
告诉将来连接服务器的客户端我是哪个端口号
进程id用来标识唯一的进程
端口号也用来标识唯一的网络进程
eg:
MySQL-3306
http:80
- 等待客户端连接
//服务器启动之后一直阻塞直到有客户端连接 返回客户端的Socket
public Socket accept() throws IOException;
- 取得输入输出流,进行通信
- 关闭流 (关闭基站)
1.2 客户端Socket类: Socket
- 连接到指定服务器,通过构造方法实现
Socket client = new Socket(ip,port);
- 取得输入输出流
getInputStream()
getOutputStream()
- 关闭流
close()
1.3 ServerSocket常用API
// 建立服务端的基站,并且绑定端口号为port
public ServerSocket(int port) throws IOException
//服务器启动之后一直阻塞直到有客户端连接
public Socket accept() throws IOException;
1.4 Socket常用API
//传入服务器的主机IP和服务器基站端口号
public Socket (String host,int port)throws UnknownHostException,IOException
//返回此套接字的输入流
public InputStream getInputStream() throws IOException
//返回此套接字的输出流
public OutputStream getOutputStream() throws IOException
//另一端的端口号
public int getPort();
//自己的端口号
public int getLocalPort();
//关闭此套接字 客户端连接请求的发起与客户端Socket的关闭都在客户端进行
public void close()throws IOException
2.单线程嗨聊
了解了上面简单的知识后我们先进行一下单线程的通信:
- 客户端发送数据给服务器,服务器接收数据并打印
- 服务器发送数据,客户端接收数据并打印
实现步骤:
1. 创建Maven工程(2个程序)
2. Maven配置
3. 服务器端实现
3.1 准备SeverSoclet对象
3.2 等待客户端连接
3.3 接收数据、发送数据
4.客户端实现
4.1 准备Socket随想,连接到服务器端
4.2 发送数据、接收数据
服务端:
import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class SingleThreadServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = null;
Scanner readFromClient = null;
PrintStream sendMegToClient = null;
try {
//1、准备Socket对象
serverSocket = new ServerSocket(7000);
System.out.println("等待客户端连接....");
//2、一直阻塞,直到有客户端连接---就可以与客户端连接
Socket client = serverSocket.accept();
System.out.println("有新的客户端连接,端口号为"+client.getPort());
//3、获取此连接的输入流和输出流 输入使用Scanner 输出使用PrintStream
//3.1、获取此连接的输入流、用户读取客户端消息
//3.2、获取此连接的输出流、用户给客户端发消息
readFromClient = new Scanner(client.getInputStream());
sendMegToClient = new PrintStream(
//autoFlush 自动刷新缓冲区
//encoding 指定通信编码
client.getOutputStream(),true,"UTF-8"
);
//表示有数据的输入
if(readFromClient.hasNext()){
System.out.println("客户端说:"+readFromClient.nextLine());
}
sendMegToClient.println("我是服务器");
} catch (IOException e) {
e.printStackTrace();
}finally {
//基站关闭
serverSocket