线程和网络实现服务器与多人聊天

线程和网络实现多人与服务器聊天

这个主要是在控制台实现简单的聊天,没有带界面。

1.首先实现多人与服务器聊天,客户端应该创建一个线程。
2.网络主要使用Socket与ServerSocket.
3.启动服务器需要一个端口号,端口号的范围是0-65535,建议不要使用1024以下的。

服务器端代码如下,Server.java

package com.yc.net;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class Server3 {
	public static void main(String[] args) throws IOException {
		//启动一个服务器 占用8888端口,端口范围是0-65535 建议不要使用1024以下的
		ServerSocket ssk=new ServerSocket(7777);
		System.out.println("服务器启动成功....");
		int i=0;
		while(true){
			Socket sk=ssk.accept();//等待接收客户端的连接,这是一个阻塞式方法
			
			//服务器端输出一下连接的客户端的ip地址
			System.out.println(sk.getInetAddress()+"连接上来了....");
			
			//启动线程
			Thread thread=new Thread(new MyClient(sk));
			thread.setName(""+i);
			i++;
			thread.start();
			
		}
		

		
	}
}
class MyClient implements Runnable{
	private Socket ck;
	private BufferedReader br=null;  //输入流
	private PrintWriter pw=null;     //输出流
	private Scanner sc=new Scanner(System.in);	//获取键盘输入的信息
	
	//构造函数
	public MyClient(Socket ck){
		this.ck=ck;
		init();
	}

	//初始化MyClient
	private void init() {
		try {
			br=new BufferedReader(new InputStreamReader(ck.getInputStream()));
			pw=new PrintWriter(ck.getOutputStream());
		} catch (IOException e1) {
			e1.printStackTrace();
		}
	}

	@Override
	public void run() {
		try {
			System.out.println("客户"+Thread.currentThread().getName()+"说:"+br.readLine());
			System.out.print("服务器请输入您回答客户"+Thread.currentThread().getName()+"的信息:");![在这里插入图片描述](https://img-blog.csdnimg.cn/20200216165516736.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTAwMzc5Ng==,size_16,color_FFFFFF,t_70)
			//获取服务器回答的信息
			String outline=null;
			outline=sc.nextLine();
			
			//监听客户端的请求
			while(!"byte".equals(outline)){
				//将服务器回答的信息发送给客户端
				pw.println(outline);
				pw.flush();
				
				System.out.println("客户"+Thread.currentThread().getName()+"说:"+br.readLine());
				System.out.print("客户"+Thread.currentThread().getName()+"请输入回答的信息:");
				outline=sc.nextLine();
			}
		} catch (IOException e1) {
			e1.printStackTrace();
		}finally{
			if(br!=null){
				try {
					br.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if(pw!=null){
				pw.close();
			}
			if(ck!=null){
				try {
					ck.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
	}
	
}

客户端代码,Client.java如下:

package com.yc.net;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Client2 {
	public static void main(String[] args) throws UnknownHostException, IOException {
		//访问本机上的7777端口
		Socket ck=new Socket("localhost",7777);
		BufferedReader br=new BufferedReader(new InputStreamReader(ck.getInputStream()));
		PrintWriter pw=new PrintWriter(ck.getOutputStream());
		
		Scanner sc=new Scanner(System.in);
		
		System.out.print("请输入你的问题:");
		String line=null;
		line=sc.nextLine();
		
		while(!"byte".equals(line)){
			pw.println(line);
			pw.flush();
			
			System.out.println("服务器端回答说:"+br.readLine());
			
			System.out.print("请输入你的问题:");
			line=sc.nextLine();
		}
	
	}
}

先运行Server.java中的代码,控制台输出了:服务器启动成功后,如下图:
在这里插入图片描述
这时候服务器已经启动了,我们先运行一下客户端,然后输入你问的问题,然后切换到服务端,服务器端回答这个客户的问题之后的效果截图,如下:
在这里插入图片描述
在这里插入图片描述

再运行一下客户端,同样可以给服务器发信息,如图:
在这里插入图片描述
在这里插入图片描述

这样就实现了一个简单的聊天,下次在更新带界面的。

发布了8 篇原创文章 · 获赞 1 · 访问量 512

猜你喜欢

转载自blog.csdn.net/weixin_45003796/article/details/104344617