(三)服務器羣發收到的信息(線程)

服務器羣發線程:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
//將服務器接收到的信息羣發送給其餘客戶端
public class OneServerMoreClientRunnable {
public static void main(String[] args) {
ExecutorService service=Executors.newFixedThreadPool(3);
ArrayList<Socket>list=null;//list也能夠在run()中建立並添加socket看本身那個方便
try {
ServerSocket serverSocket=new ServerSocket(8888);
Socket socket=null;
while(true){
//有一個客戶端鏈接就建立一個線程
socket=serverSocket.accept();
list=new ArrayList<>();
/*
MyThread mThread=new MyThread(socket,list);
//Thread t=new Thread(mThread);
mThread.start();//開啓線程
*/service.execute(new MyThread(socket, list));//線程池
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class MyThread extends Thread{
//接收傳進來的套接字
private Socket socket;
private ArrayList<Socket> list;
    public  MyThread(Socket socket,ArrayList<Socket> list) {
    this.socket=socket;
    this.list=list;
}
InputStream is=null;
OutputStream os=null;
BufferedReader br=null;
String str=null;
String ip=null;
int port;
String str2=null;
@Override
public void run() {
list.add(socket);
try {
is=socket.getInputStream();
br=new BufferedReader(new InputStreamReader(is));
ip=socket.getInetAddress().getHostAddress();
port=socket.getPort();
while(true){
str=br.readLine();
//System.out.println(str);
if(str==null||"".equals(str)||socket==null){
break;
}
str2="ip"+ip+":端口"+port+str;
//遍歷發送給其餘客戶端,第一種
Iterator<Socket>iter=list.iterator();
for(;iter.hasNext();){
socket=iter.next();
os=socket.getOutputStream();
os.write(str2.getBytes());
}
/*//遍歷發送給其餘客戶端,第二種
 for(Socket s:list){
     os=s.getOutputStream();
     os.write(str2.getBytes());
 }
 */
}
} catch (IOException e) {
e.printStackTrace();
System.out.println(socket.getInetAddress().getHostAddress()+"退出");
}
try {
is.close();
br.close();
os.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} 
客戶端:
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
/*
 * 客戶端接收控制檯的數據,發送到服務端,
 * 當服務端接收到數據後,回客戶端一條信息。
 */
public class ClientTcpDemo3 {
public static void main(String[] args) throws Exception {
 Socket socket=new Socket("127.0.0.1", 8888);
     OutputStream os=socket.getOutputStream();
     InputStream is=null;
     is=socket.getInputStream();
     byte[]b=new byte[1024];
     System.out.println("請輸入發送數據");
     Scanner sc=new Scanner(System.in);
     while(true){
     String str=sc.nextLine();
     if("886".equals(str)){
     break;
     }
     byte[]a=str.getBytes();
    //若是接收是用緩衝流的話,有readLine()時,發送端必定要有回車換行符服務器才能接受到
     os.write(a, 0, a.length);
     os.write("\r\n".getBytes());
     
    int len=is.read(b);
    System.out.println(new String (b,0,len));
     }
     socket.close();
     os.close();
}
}
相關文章
相關標籤/搜索