⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 multicliserver.java

📁 Java就业的培训教程书籍
💻 JAVA
字号:
import java.io.*;
import java.net.*;
/**类MultiCliServer是多客户的服务器端程序,该程序通过线程实现多客户通信机制*/
public class MultiCliServer{
	/*整型变量clientnum表示客户端的个数*/
	static int clientnum = 0;
	public static void main(String args[])throws IOException{
		/*声明一个ServerSocket对象,初始值为null*/
		ServerSocket serverSocket = null;
		/*声明一个布尔变量existClient,用于表示端口处有无客户端的访问*/
		boolean existClient = true;
		/*由于ServerSocket的生成和关闭都有可能产生错误,因此需要进行例外处理*/
		try{
			try{
				/*生成serverSocket对象,该对象负责监听端口4700*/
				serverSocket=new ServerSocket(4700);
			}catch(IOException e) {
				System.out.println("对不起,不能监听端口:4700."); 
				System.exit(-1);
			}
			/*对机器的4700端口进行监听,看是否有客户端的socket连接*/
			while(existClient)
			{
				/*如果有客户端的socket连接,就生成ServerThread类的对象,也就是新生成一个线程对象,以进行输入流、输出流生成以及数据的读取操作*/
				ServerThread threadObj = new ServerThread(serverSocket.accept(),clientnum);
				/*启动threadObj线程对象,执行线程对象中的run()方法*/
				threadObj.start();
				/*将客户端的数目加1*/
				clientnum++;
			}
			/*将服务器的socket关闭*/
			serverSocket.close();
		}catch(IOException e){}
	}
}
/**类ServerThread是Thread的子类,用于创建一个线程对象来实现一个客户端和服务器端的通信*/
class ServerThread extends Thread{
	/*生成一个Socket对象,初始值为null*/
	Socket clientSocket = null;
	/*声明一个静态整型变量clientnum*/
	int clientnum;
	/*构造方法对上面的对象和变量赋值*/
	public ServerThread(Socket socket,int num) {
		clientSocket=socket;
		/*每生成一个线程,客户端数目就加1*/
		clientnum=num+1;
	}
	/*方法run()实现输入流、输出流的创建以及数据的读取和输出*/
	public void run() {
		/*由于socket的生成和关闭都有可能产生错误,因此需要进行例外处理*/
		try{
			/*声明一个字符串变量,用于存放读取的一行数据*/
			String lineStr;
			/*通过socket对象的getInputStream()方法获得输入流,将它赋给inObj对象*/
			InputStream inObj = clientSocket.getInputStream();
			/*根据上面的InputStream类对象inObj生成InputStreamReader类的对象streamObj1*/
			InputStreamReader streamObj1 = new InputStreamReader(inObj);
			/*根据streamObj1生成BufferedReader类的对象buffObj1,以提高数据读取效率*/
			BufferedReader buffObj1 = new BufferedReader(streamObj1);
			/*获得socket的输出流,将它赋给OutputStream类的对象putObj*/
			OutputStream putObj = clientSocket.getOutputStream();
			/*根据获得的输出流创建PrintWriter类对象outObj,用于输出信息*/
			PrintWriter outObj = new PrintWriter(putObj);
			/*生成一个InputStreamReader对象,对应键盘的输入*/
			InputStreamReader streamObj2 = new InputStreamReader(System.in);
			/*根据上面的streamObj2输入流创建BufferedReader类的对象,以提高数据读取效率*/
			BufferedReader buffObj2 = new BufferedReader(streamObj2);
			/*输出客户端的输入信息*/
			System.out.println("Client "+clientnum+ ":" + buffObj1.readLine());
			/*读取服务器端键盘输入的数据,放在字符串lineStr中*/
			lineStr = buffObj2.readLine();
			/*判断服务器端输入的字符串是不是“end”,如果不是就进行循环*/
			while(!lineStr.equals("end"))
			{
				/*将服务器端输入的字符串通过socket在客户端输出*/
				outObj.println(lineStr);
				/*在客户端强制输出服务器端输入的字符串*/
				outObj.flush();
				/*在服务器端输出自己这端键盘输入的字符串*/
				System.out.println("Server:"+lineStr);
				/*在服务器端输出客户端输入的信息*/
				System.out.println("Client "+ clientnum + ":" +buffObj1.readLine());
				/*将服务器端键盘输入的信息放在字符串变量lineStr中*/
				lineStr = buffObj2.readLine();
			}
			/*关闭输出流*/
			outObj.close();
			/*关闭输入流*/
			buffObj1.close();
			/*关闭socket*/
			clientSocket.close();
		}catch(Exception e) {
			System.out.println("错误:"+e);
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -