网络版聊天室(畅聊项目)


在实现网络聊天室之前,首先我们应该了解一下关于网络中的Socket编程

1.关于Socket编程

服务端Socket类 :ServerSocket
客户端Socket类 :Socket

1.1 服务端Socket类 :ServerSocket

  1. 传入端口号,建立服务端Socket等待客户连接,通过构造方法建立基站
ServerSocket server = new ServerSocket(port);

为什么要有端口号?
  告诉将来连接服务器的客户端我是哪个端口号
进程id用来标识唯一的进程
端口号也用来标识唯一的网络进程

eg:
MySQL-3306
http:80
  1. 等待客户端连接
//服务器启动之后一直阻塞直到有客户端连接 返回客户端的Socket
public Socket accept() throws IOException;
  1. 取得输入输出流,进行通信
  2. 关闭流 (关闭基站)

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值