Java络编程-实现客户端与客户端循环聊天_带思路

涎涎原创约 932 字大约 3 分钟...JavaJava

251-Java络编程-实现客户端与客户端循环聊天_带思路.md

注意

本博文仅供学术研究和交流参考,严禁将其用于商业用途。如因违规使用产生的任何法律问题,使用者需自行负责。

示例代码

package com.tencent.chapter05.带思路版;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

//客户端:接收消息线程
public class T_Client_Thread_Receive extends Thread {

	private Socket socket;
	
	public T_Client_Thread_Receive(Socket socket)
	{
		this.socket = socket;
	}
	
	@Override
	public void run() {
		try {
			while(true)
			{
				BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));//字符流  一行一行读取数据
				String message = reader.readLine();
				
				System.out.println("服务端说:" + message);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} 
	}
}
package com.tencent.chapter05.带思路版;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

//客户端:发送消息线程
public class T_Client_Thread_Send extends Thread {
	
	private Socket socket;
	
	public T_Client_Thread_Send(Socket socket)
	{
		this.socket = socket;
	}
	
	@Override
	public void run() {
		try {
			while(true)
			{
				PrintWriter writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));//字符流  一行一行输出数据
	
				Scanner scanner = new Scanner(System.in);
				System.out.println("客户端,请输入:");
				String sendMessage = scanner.nextLine();
				
				writer.println(sendMessage);
				writer.flush();
				
				//判断如果客户端输入"exit",表客户端准备退出
				if("exit".equals(sendMessage))
				{
					break;
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}           
	}
	
}
package com.tencent.chapter05.带思路版;

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

//客户端
public class T_Client {

	public static void main(String[] args) {
		Socket socket = null;
		try {
			//3.连接服务器
			socket = new Socket("127.0.0.1",8888);//localhost 127.0.0.1表示本机    也可以写具体的IP地址
		
			//4.给服务器发送消息
			T_Client_Thread_Send sendThread = new T_Client_Thread_Send(socket);
			sendThread.start();
			
			//7.接收服务器消息
			T_Client_Thread_Receive receiveThread = new T_Client_Thread_Receive(socket);
			receiveThread.start();
			
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			//8.关闭资源、释放资源
			/*try {
				if(socket != null)
				{
					socket.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}*/
		}
	}
}
package com.tencent.chapter05.带思路版;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Collection;
import java.util.HashMap;
import java.util.Scanner;

//服务端线程:负责与客户端之间互发消息
public class T_Server_Thread extends Thread {

	private Socket socket;
	
	public T_Server_Thread(Socket socket)
	{
		this.socket = socket;
	}
	
	@Override
	public void run() {
		try {
			BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));//字符流  一行一行读取数据
			PrintWriter writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); //字符流  一行一行输出数据
			while(true)
			{
				//5.接收客户端发送的消息
				String message = reader.readLine();
				System.out.println("客户端说:" + message);
				
				//判断客户端是否下线
				if("exit".equals(message))
				{
					System.out.println("----------【公告:客户端已下线】-----------------");
				}
				
				//群发:给所有客户端转发收到的消息
				HashMap<Integer,Socket> socketMap = T_Server.socketMap;
				Collection<Socket> sockets = socketMap.values();
				for (Socket clientSocket : sockets) {
					PrintWriter clientWriter = new PrintWriter(new OutputStreamWriter(clientSocket.getOutputStream())); //字符流  一行一行输出数据
					clientWriter.println(message);
					clientWriter.flush();
				}
				
				//6.给客户端发送消息
				/*Scanner scanner = new Scanner(System.in);
				System.out.println("服务端,请输入:");
				String sendMessage = scanner.nextLine();
				
				writer.println(sendMessage);
				writer.flush();*/
			}
		} catch (IOException e) {
			e.printStackTrace();
		}   
	}
}
package com.tencent.chapter05.带思路版;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;

//服务器
public class T_Server {

	//用于保存所有跟客户端聊天的socket对象
	static HashMap<Integer,Socket> socketMap = new HashMap<>();
	
	public static void main(String[] args) {
		ServerSocket ss = null;
		Socket socket = null;
		try {
			//1.启动服务器
			ss = new ServerSocket(8888);
			System.out.println("服务器已启动....");
			
			int count = 1;
			while(true)
			{
				//2.等待客户端连接
				socket = ss.accept();//阻塞式方式,直到客户端连接进来,后续代码才能继续执行
				System.out.println("有新的客户端连接进来........" + socket.getInetAddress() + ":" + socket.getPort());
				
				//保存所有的socket
				socketMap.put(count++, socket);
				
				//开启一个线程专门负责与客户端聊天
				T_Server_Thread t1 =new T_Server_Thread(socket);
				t1.start();
				
				System.out.println(socketMap);
			}
			
		} catch (IOException e) {
			e.printStackTrace();
		} finally{
			//8.关闭资源、释放资源
			try {
				if(socket != null)
				{
					socket.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
			try {
				if(ss != null)
				{
					ss.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
}

分割线


相关信息

以上就是我关于 Java络编程-实现客户端与客户端循环聊天_带思路 知识点的整理与总结的全部内容,希望对你有帮助。。。。。。。

上次编辑于:
贡献者: 涎涎
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.4