分享一个从国外网站看到的socket程序,程序并不强悍,但能从代码中看到老外是怎么写代码的,咱可以取长补短

本文介绍了一个简单的聊天服务器程序,该程序能够接收客户端消息并广播给所有在线用户,同时维护在线用户列表。通过三个线程分别处理客户端连接、用户名更新及消息分发。

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

原文:分享一个从国外网站看到的socket程序,程序并不强悍,但能从代码中看到老外是怎么写代码的,咱可以取长补短

源代码下载地址:http://www.zuidaima.com/share/1550463702764544.htm

package com.zuidaima.xs;

/****************************************************************
*	Version		:	1.0
*	Date		:	02/03/2007
*       Author          :       www.zuidaima.com
*	
*	Description
*	This is a Server Side application of Chat System.
*	This application is used for receiving the messages from any client
*	and send to each and every client and in this we can maintain the
*	list of all online users.
*
*	Remarks
*	This application is unable to provide the private chatting facility
******************************************************************/

import java.io.*;
import java.net.*;
import java.util.*;

public class MyServer{
	ServerSocket ss;
	Socket s;
	ArrayList al=new ArrayList();
	ArrayList al1=new ArrayList();
	ArrayList al2=new ArrayList();
	ArrayList alname=new ArrayList();
	Socket s1,s2;
	MyServer()throws IOException{
		ss=new ServerSocket(1004);	// create server socket
		while(true){
			s=ss.accept();	//accept the client socket
			s1=ss.accept();
			s2=ss.accept();
			al.add(s);	// add the client socket in arraylist
			al1.add(s1);
			al2.add(s2);
			System.out.println("Client is Connected");
			MyThread2 m=new MyThread2(s2,al2,alname); //new thread for maintaning the list of user name
			Thread t2=new Thread(m);
			t2.start();

			MyThread r=new MyThread(s,al);//new thread for receive and sending the messages
			Thread t=new Thread(r);
			t.start();
			
			MyThread1 my=new MyThread1(s1,al1,s,s2); // new thread for update the list of user name
			Thread t1=new Thread(my);
			t1.start();
		}
	}
	public static void main(String[] args){
		try{
			new MyServer();			
		}catch (IOException e){}
	}
}
//class is used to update the list of user name
class MyThread1 implements Runnable{
	Socket s1,s,s2;
	static ArrayList al1;
	DataInputStream ddin;
	String sname;
	MyThread1(Socket s1,ArrayList al1,Socket s,Socket s2){
		this.s1=s1;
		this.al1=al1;
		this.s=s;
		this.s2=s2;
	}
	public void run(){	
		try{
		ddin=new DataInputStream(s1.getInputStream());
		while(true){
		sname=ddin.readUTF();
		System.out.println("Exit  :"+sname);
		MyThread2.alname.remove(sname);//remove the logout user name from arraylist
		MyThread2.every();
		al1.remove(s1);
		MyThread.al.remove(s);
		MyThread2.al2.remove(s2);
		if(al1.isEmpty())
			System.exit(0); //all client has been logout
		}
		}catch(Exception ie){}
	}
}

// class is used to maintain the list of all online users
class MyThread2 implements Runnable{
	Socket s2;
	static ArrayList al2;
	static ArrayList alname;
	static DataInputStream din1;	
	static DataOutputStream dout1;

	MyThread2(Socket s2,ArrayList al2,ArrayList alname){
		this.s2=s2;
		this.al2=al2;
		this.alname=alname;
	}
	public void run(){
		try{
		din1= new DataInputStream(s2.getInputStream());
		alname.add(din1.readUTF());	// store the user name in arraylist
		every();
		}catch(Exception oe){System.out.println("Main expression"+oe);}
	}
	// send the list of user name to all client
	static void every()throws Exception{
		Iterator i1=al2.iterator();
		Socket st1;		

		while(i1.hasNext()){
			st1=(Socket)i1.next();
			dout1=new DataOutputStream(st1.getOutputStream());
			ObjectOutputStream obj=new ObjectOutputStream(dout1);
			obj.writeObject(alname); //write the list of users in stream of all clients
			dout1.flush();
			obj.flush();
		}
	}
}
//class is used to receive the message and send it to all clients
class MyThread implements Runnable{
	Socket s;
	static ArrayList al;
	DataInputStream din;
	DataOutputStream dout;

	MyThread(Socket s, ArrayList al){
		this.s=s;
		this.al=al;
	}
	public void run(){
		String str;
		int i=1;
		try{
		din=new DataInputStream(s.getInputStream());
		}catch(Exception e){}
		
		while(i==1){
				try{
					
					str=din.readUTF(); //read the message
					distribute(str);
				}catch (IOException e){}
			}
	}
	// send it to all clients
	public void distribute(String str)throws IOException{
		Iterator i=al.iterator();
		Socket st;
		while(i.hasNext()){
			st=(Socket)i.next();
			dout=new DataOutputStream(st.getOutputStream());
			dout.writeUTF(str);
			dout.flush();
		}
	}
}

	    			


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值