java實現tcp伺服器(單執行緒、多執行緒)、客戶端
伺服器端接收客戶申請,響應時間戳和使用者源字串。
客戶端使用控制檯作為輸入輸出流
tcp伺服器端程式碼
packageofollow,noindex">com.lp.app.net ;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
//tcp伺服器,單執行緒和多執行緒
public class TCPServer{
public static void main(String[] args) { moreserver(1234);}//讀取輸入文字,返回響應文字(二級制,物件)public static void server(int port) { try { //建立一個serversocket ServerSocket mysocket=new ServerSocket(port); //等待監聽是否有客戶端連線 Socket sk = mysocket.accept(); //接收文字資訊 BufferedReader in =new BufferedReader(new InputStreamReader(sk.getInputStream())); String data =in.readLine(); System.out.println("客戶端訊息:"+data);複製程式碼
// //接收二進位制位元組流// DataInputStream dis =new DataInputStream(new BufferedInputStream(sk.getInputStream()));// byte[] enter =new byte[dis.available()];// dis.read(enter);//
// //接收物件資訊// ObjectInput ois =new ObjectInputStream(new BufferedInputStream(sk.getInputStream()));// Object object=ois.readObject();
//輸出文字 PrintWriter out =new PrintWriter(new BufferedWriter(new OutputStreamWriter(sk.getOutputStream())),true); out.println(new Date().toString()+":"+data); //伺服器返回時間和客戶傳送來的訊息 out.close();複製程式碼
// //輸出二進位制// DataOutputStream dos=new DataOutputStream(sk.getOutputStream());// byte[] back="luanpeng".getBytes();// dos.write(back);//
// //輸出物件// ObjectOutputStream oos=new ObjectOutputStream(sk.getOutputStream());// oos.writeObject(new Date()); //返回一個時間物件// oos.close();
} catch (Exception e) { // TODO: handle exception }}//多執行緒伺服器public static void moreserver(int port){ try { System.out.println("伺服器啟動..............."); ServerSocket server=new ServerSocket(port); while(true) { //阻塞,直到有客戶連線 Socket sk=server.accept(); //啟動服務執行緒 new ServerThread(sk).start(); } } catch (Exception e) { e.printStackTrace(); }}複製程式碼
}
//使用執行緒為多個客戶端服務
class ServerThread extends Thread
{
private Socket sk;
ServerThread(Socket sk)
{
this.sk=sk;
}
//執行緒執行實體
public void run() {
BufferedReader in=null;
PrintWriter out=null;
try {
InputStreamReader isr;
isr=new InputStreamReader(sk.getInputStream());
in=new BufferedReader(isr);
out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(sk.getOutputStream())),true);
while(true)
{
//接收來自客戶端的請求,根據不同的命令返回不同的資訊
String cmd=in.readLine();
System.out.println(cmd);
if (cmd==null) {
break;
}
out.println(new Date().toString()+":"+cmd); //伺服器返回時間和客戶傳送來的訊息
}
} catch (Exception e) {
e.printStackTrace();
}
finally{
try {
if (in!=null) {
in.close();
}
if (out!=null) {
out.close();
}
if (sk!=null) {
sk.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
tcp客戶端程式碼
packagecom.lp.app.net ;
importjava.io . ;importjava.net . ;
//客戶端
public class TCPClient {
public static void main(String [] args) throws IOException { connect("192.168.8.102", 1234);}//遠端連線public static void connect(String host,int port){ try { System.out.println("客戶端啟動..............."); Socket sock = new Socket(host, port); // 建立一個寫執行緒 new TelnetWriter(sock.getOutputStream()).start(); // 建立一個讀執行緒 new TelnetReader(sock.getInputStream()).start(); } catch (Exception e) { // TODO: handle exception }}複製程式碼
}
//從控制檯讀取使用者輸入命令 執行緒類
class TelnetWriter extends Thread {
private PrintStream out;
public TelnetWriter(OutputStream out) { this.out = new PrintStream(out);}public void run() { try { // 包裝控制檯輸入流 BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); // 反覆將控制檯輸入寫到Telnet服務程式 while (true) out.println(in.readLine()); } catch (IOException exc) { exc.printStackTrace(); }}複製程式碼
}
//將響應資料列印到控制檯 執行緒類
class TelnetReader extends Thread {
private InputStreamReader in;
public TelnetReader(InputStream in) { this.in = new InputStreamReader(in);}public void run() { try { // 反覆將Telnet服務程式的反饋資訊顯示在控制檯螢幕上 while (true) { // 從Telnet服務程式讀取資料 int b = in.read(); if (b == -1) System.exit(0); // 將資料顯示在控制檯螢幕上 System.out.print((char) b); } } catch (IOException exc) { exc.printStackTrace(); }}複製程式碼
}
如果你想學好JAVA這門技術,也想在IT行業拿高薪,可以參加我們的訓練營課程,選擇最適合自己的課程學習,技術大牛親授,8個月後,進入名企拿高薪。我們的課程內容有:Java工程化、高效能及分散式、高效能、深入淺出。高架構。效能調優、Spring,MyBatis,Netty原始碼分析和大資料等多個知識點。如果你想拿高薪的,想學習的,想就業前景好的,想跟別人競爭能取得優勢的,想進阿里面試但擔心面試不過的,你都可以來,q群號為:180705916 進群免費領取學習資料。
作者:高階java架構師
連結:https://juejin.im/post/5ba35b255188256baa21cc7b
來源:掘金
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。