本文个人在北京游玩的时候突然想到的...近期就有想写几篇关于线程客户端的笔记,所以回家到之后就奋笔疾书的写出来发布了
下面展示一个多客户端的Socket编程实例,例子很简单,要实现多客户端通信,就只能借助于多线程技术,其实就是将Socket通信代码写在run()方法中,由于测试代码并非是真正的多台计算机与一个服务器相连,所以并不能在举动当作真正的多客户端通信,只是由于多线程给我们造成了一种多客户端的假象而已。
package rick_demo;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JFrame;
public class ServerDemo extends JFrame{
private static final long serialVersionUID = 1L;
public static void main(String[] args)throws IOException{
ServerVallyDemo svd= new ServerVallyDemo();
svd.setDaemon(true);
svd.start();
do{
System.out.println("input some words of main");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str=br.readLine();
new ClientDemo(str).start();
}while(true);
}
}
/**
* 客户端类担任接受信息和发送信息
*/
class ClientDemo extends Thread{
private Socket s1;
private PrintWriter out1;
private BufferedReader tempOut;
//private BufferedReader in1;
//private final int ID;
private final String str;
public ClientDemo(String str){
this.str = str;
}
public void run(){
try{
s1=new Socket("127.0.0.1",10000);
out1 = new PrintWriter(s1.getOutputStream(),true);
out1 .println(str);
tempOut= new BufferedReader(new InputStreamReader(s1.getInputStream()));
System.out.println(tempOut.readLine());
tempOut.close();
out1.close();
s1.close();
Thread.sleep(100); //模拟真正的业务处理时光
}catch(IOException e){
}catch(InterruptedException e){
}
}
}
/**
* 服务器类担任接受信息和发送信息
*/
class ServerVallyDemo extends Thread {
private ServerSocket ss ;
private Socket s1;
private PrintWriter out1;
private BufferedReader in1;
public void run(){
while(true){
try{
ss= new ServerSocket(10000);
s1=ss.accept();
/*send the data to the client machine */
//tempOut = new BufferedReader(new InputStreamReader(s1.getInputStream()));
out1 = new PrintWriter(s1.getOutputStream(),true);
out1 .println("已经收到你的信息");
/*receive the data from client machine*/
in1= new BufferedReader(new InputStreamReader(s1.getInputStream()));
System.out.println(in1.readLine());
in1.close();
out1.close();
ss.close();
}catch(IOException e){
}
}
}
}
有时候为一个请求就创立一个新线程,其开销是非常大的,创立或销毁一个线程甚至比处理请求花的时光和资源还要多。如果要实现采用线程池技术,以防止频仍创立线程和销毁线程的价值太大,那么就应该采用线程池来启动一个线程,实现给定一个适合的线程池的容量。上面的例子采用线程池启动线程的代码只要改动一下main()方法就可以了,详细代码如下:
public static void main(String[] args)throws IOException{
ServerVallyDemo svd= new ServerVallyDemo();
svd.setDaemon(true);
svd.start();
ExecutorService exec= Executors.newFixedThreadPool(3);
do{
System.out.println("input some words of main");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str=br.readLine();
exec.execute(new ClientDemo(str));
}while(true);
}
文章结束给大家分享下程序员的一些笑话语录:
一位程序员去海边游泳,由于水性不佳,游不回岸了,于是他挥着手臂,大声求.救:“F1,F1!”
---------------------------------
原创文章 By
线程和客户端
---------------------------------