java socket实现一服务器多客户端相互通信的草稿

本文详细介绍了使用Java实现TCP即时通讯系统的全过程,包括服务器端与客户端的建立、数据收发线程的创建与管理,以及利用Socket进行网络通信的具体代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

逐渐改吧,先这

么实现着。

 

服务器:

import java.net.Socket;

public class TcpIM {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SendThread sth=new SendThread();
		sth.start();
		Socket Soc=SocketUtil.BuildServerSocket(4211);
		
		//SocketUtil.RecieveMessage(Soc);
		/*
		RecieveThread rth=new RecieveThread(Soc);
		rth.start();
		System.out.println("接收线程已运行");
		*/
		
		
		

		
	}
	
}

 客户端:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Map;
import java.util.HashMap;
class SocketUtil{
	public static Socket BuildServerSocket(int port) {
		
		ServerSocket SerSoc=null;
		Socket Soc=null;
		try {
			SerSoc=new ServerSocket(port);
			while(true){
			System.out.println("等待连接。。。");
			Soc=SerSoc.accept();
			System.out.println(Soc.getRemoteSocketAddress().toString()+"已连接到服务器!");
			System.out.println(Soc.getPort());
			
			pubVal.SocMap.put(Soc.getPort()+"",Soc);
			SocketUtil.SendMessage(pubVal.SocMap.get(Soc.getPort()+""), "已连接至服务器:"+Soc.getLocalSocketAddress().toString());
			SocketUtil.SendMessage(pubVal.SocMap.get(Soc.getPort()+""), "本机接口为:"+Soc.getPort());
			RecieveThread rth=new RecieveThread(Soc);
			rth.start();
			}
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return Soc;
		
	}
	public static Socket BuildClientSocket(String SerIP,int port) {
		Socket Soc=null;
		try {
			Soc=new Socket(SerIP,port);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return Soc;
	}
	public static String RecieveMessage(Socket Soc) {
		String Message=null;
		try {
			byte[] buf=new byte[4096];
			int len=0;
			InputStream in=Soc.getInputStream();
			while((len=in.read(buf))!=-1) {
				Message=new String(buf,0,len);
				System.out.println(Message);
				
			}
			
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return Message;
	}
	public static int SendMessage(Socket Soc,String StrMessage) {
		int flag;
		try {
			OutputStream out=Soc.getOutputStream();
			
			out.write(StrMessage.getBytes());
			flag=1;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			flag=0;
		}
		return flag;
	}
}

 Socket类

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class TcpIMClient {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Socket Soc=SocketUtil.BuildClientSocket("192.168.1.100",4211);
		RecieveThread rth=new RecieveThread(Soc);
		rth.start();
		String StrMessage="";
		Scanner Scan=new Scanner(System.in);
		while(true) {
			System.out.println("按回车发送2:");
			StrMessage=Scan.nextLine();
			//String strPort=StrMessage.substring(StrMessage.indexOf('@')+1,StrMessage.indexOf(' '));
			//System.out.println(strPort);
			//Soc=pubVal.SocMap.get(strPort);
			//SocketUtil.SendMessage(Soc, StrMessage);
			SocketUtil.SendMessage(Soc,StrMessage);
			
		}
		
	}

}
/*
class RecieveThread extends Thread{
	private Socket Soc;
	public RecieveThread(Socket ClientSoc) {
		Soc=ClientSoc;
	}
	public void run() {
		SocketUtil.RecieveMessage(Soc);
	}
}
*/

 线程类:

import java.net.Socket;

class RecieveThread extends Thread{
	private Socket Soc;
	public RecieveThread(Socket ClientSoc) {
		Soc=ClientSoc;
	}
	public void run() {
		SocketUtil.RecieveMessage(Soc);
	}
}

 

import java.net.Socket;
import java.util.Scanner;

public class SendThread extends Thread{
	//private Socket Soc;
	//public SendThread(Socket ClientSoc) {
		//Soc=ClientSoc;
	//}
	public void run() {
		Socket Soc;
		String StrMessage="";
		Scanner Scan=new Scanner(System.in);
		while(true) {
			System.out.println("按回车发送1:");
			StrMessage=Scan.nextLine();
			//System.out.println(StrMessage.indexOf('@')+"     "+StrMessage.indexOf(' '));
			if(StrMessage.indexOf('@')==0 && StrMessage.indexOf(' ')>0) {
				String strPort=StrMessage.substring(StrMessage.indexOf('@')+1,StrMessage.indexOf(' '));
				//System.out.println(strPort);
				Soc=pubVal.SocMap.get(strPort);
				if(null!=Soc) {
					SocketUtil.SendMessage(Soc, StrMessage);
				}else {
					System.out.println("端口号制定错误!"+strPort+" 不存在");
				}
			}else {
				System.out.println("没有指定发送接口");
			}
		}
	}
}

全局变量:

 

import java.net.Socket;
import java.util.HashMap;
import java.util.Map;

public  class pubVal {
	static Map<String,Socket> SocMap=new HashMap<String,Socket>();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值