线程和网络实现多人与服务器聊天
这个主要是在控制台实现简单的聊天,没有带界面。
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中的代码,控制台输出了:服务器启动成功后,如下图:
这时候服务器已经启动了,我们先运行一下客户端,然后输入你问的问题,然后切换到服务端,服务器端回答这个客户的问题之后的效果截图,如下:
再运行一下客户端,同样可以给服务器发信息,如图:
这样就实现了一个简单的聊天,下次在更新带界面的。