java socket網路通訊
阿新 • • 發佈:2018-12-20
1.客戶端給伺服器傳送1句話
import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStreamWriter; import java.net.Socket; public class ClientSocket1 { public static void main(String[] args) throws IOException, InterruptedException { Socket socket = new Socket("127.0.0.1", 9999); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); bw.write("hello word"); bw.newLine(); bw.flush(); } } import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; /** * 客戶端給服務端傳送1條資料 */ public class ServerScoket1 { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(9999); Socket socket = serverSocket.accept(); BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); while (true){ String s = br.readLine(); System.out.println(s); } } }
2.客戶端給伺服器傳送n句話
import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStreamWriter; import java.net.Socket; import java.util.Scanner; public class ClientSocket2 { public static void main(String[] args) throws IOException { Socket socket = new Socket("127.0.0.1", 9999); //建立字元輸出流 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); Scanner scanner = new Scanner(System.in); //迴圈往伺服器寫資料 String str; while (!(str=scanner.nextLine()).equalsIgnoreCase("close")){ bw.write(str); bw.newLine();//必須加上換行,這樣伺服器就能讀出一行資料 bw.flush(); } //釋放資源 bw.close(); socket.close(); } } import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; /** * 客戶端給服務端傳送無限多資料 * 當客戶端輸入close(不區分大小寫)時,通訊結束 */ public class ServerSocket2 { public static void main(String[] args) throws IOException { //獲取客戶端連線 ServerSocket serverSocket = new ServerSocket(9999); Socket socket = serverSocket.accept(); //建立字元輸入流, BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); //迴圈讀資料 String str ; while ((str = br.readLine())!=null){ System.out.println(str); } //關流 br.close(); socket.close(); } }
3.伺服器和1個客戶端相互發送資料
package com.itheima.test; import java.io.*; import java.net.Socket; import java.util.Scanner; public class ClientSocket3 { public static void main(String[] args) throws IOException { Scanner scanner = new Scanner(System.in); //建立客戶端socket Socket socket = new Socket("127.0.0.1", 9999); //接收資料的方法 Runnable myRunReceive = new Runnable() { @Override public void run() { try { BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); String str; //這個地方等待服務端關閉傳送資料流,關閉之後就跳出迴圈 while ((str=br.readLine())!=null){ System.out.println(str); } //關流 br.close(); socket.close(); } catch (Exception e) { e.printStackTrace(); } } }; //傳送資料的方法 Runnable myRunSend = new Runnable() { @Override public void run() { //建立字元輸出流 try { BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); //傳送資料,當輸入close時,結束 String str=null; while (!(str=scanner.nextLine()).equalsIgnoreCase("close")){ bw.write(str); bw.newLine(); bw.flush(); } //跳出迴圈時,關流 bw.close(); socket.close(); } catch (Exception e) { } } }; //開啟1個執行緒執行接收資料 new Thread(myRunReceive).start(); //開啟1個執行緒執行傳送資料 new Thread(myRunSend).start(); } } package com.itheima.test; import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; /** * 客戶端,服務端雙方相互通訊,有1方輸入close,結束通訊 */ public class ServerSocket3 { public static void main(String[] args) throws IOException { Scanner scanner = new Scanner(System.in); //等待客戶端 ServerSocket serverSocket = new ServerSocket(9999); Socket socket = serverSocket.accept(); //向客戶端傳送資料方法 Runnable myRunSend = new Runnable() { @Override public void run() { //建立字元輸出流 try { BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); //傳送資料,當輸入close時,結束 String str=null; while (!(str=scanner.nextLine()).equalsIgnoreCase("close")){ bw.write(str); bw.newLine(); bw.flush(); } //跳出迴圈時,關流 bw.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }; //從客戶端接收資料方法 Runnable myRunReceive = new Runnable() { @Override public void run() { try { BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); String str; //這個地方等待客戶端關閉傳送資料流,關閉之後就跳出迴圈 while ((str=br.readLine())!=null){ System.out.println("客戶端:"+str); } //關流 br.close(); socket.close(); } catch (Exception e) { e.printStackTrace(); } } }; //開啟執行緒傳送資料 new Thread(myRunSend).start(); //開啟執行緒 ,接收資料 new Thread(myRunReceive).start(); } }
4.伺服器和多個客戶端收發資料,客戶端還用上面的ClientSocket3
package com.itheima.test;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 伺服器可以接收多個客戶端
* 客戶端,服務端雙方相互通訊,有1方輸入close,結束通訊
*/
public class ServerSocket4 {
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
//
ServerSocket serverSocket = new ServerSocket(9999);
//建立執行緒池
ExecutorService executorPool = Executors.newCachedThreadPool();
ArrayList<Socket> sockets = new ArrayList<>();
Runnable myRunSend = new Runnable() {
@Override
public void run() {
System.out.println("執行緒開啟");
try {
while(true){
String str = scanner.nextLine();//這裡要等以下,因為是多執行緒,如果sockets裡沒內容,這個執行緒直接結束了,所以這個地方卡在輸入這
for (Socket socket : sockets) {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//這個是給所有客戶端發個小說
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("/Users/liudawei/Documents/develop/javaweb/day19_project/src/com/itheima/test/aa.txt")));
String str3 = null;
while ((str3=br.readLine())!=null){
bw.write(str3);
bw.newLine();
bw.flush();
}
// 這個是傳送一行短的語句
// bw.write("伺服器:"+str);
// bw.newLine();
// bw.flush();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
};
executorPool.execute(myRunSend);
//接收客戶端資料
while (true) {
Socket socket = serverSocket.accept();
sockets.add(socket);
//從客戶端接收資料方法
Runnable myRunReceive = new Runnable() {
@Override
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String str;
//這個地方等待客戶端關閉傳送資料流,關閉之後就跳出迴圈
while ((str = br.readLine()) != null) {
String str1 = "客戶端" + Thread.currentThread().getName() + ":" + str;
System.out.println(str1);
//這裡向每一個客戶端傳送資料,包括自己
for (Socket socket1 : sockets) {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket1.getOutputStream()));
bw.write(str1);
bw.newLine();
bw.flush();
}
}
//關流
br.close();
sockets.remove(socket);
Thread.sleep(2000);
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
};
executorPool.execute(myRunReceive);
}
}
}
涉及到多執行緒,沒有用執行緒同步,也可以實現需求