TCP協(xié)議的通信實例
TCP協(xié)議的通信實例
馬克-to-win:我們首先給出一個最最簡單的helloworld通信程序。讓大家體會一把兩臺機器的通信,大家之后就可以慢慢把它發(fā)展成為聊天程序。馬克-to-win:TCP通信有兩個類:1)ServerSocket:服務器用它監(jiān)聽進入的連接;2)Socket:雙方都用它初始一次連接。一旦客戶端申請建立一個連接,ServerSocket就會返回(通過accept()方法)一個對應的服務器端的Socket,以便進行直接通信。從此時起,我們就得到了一對真正的“Socket-Socket”連接,此時可以利用getInputStream()以及getOutputStream()從每個Socket產生對應的 InputStream和OutputStream對象。之后,可按上章介紹的方法對類進行處理,就象原來對待其他任何流對象那樣。創(chuàng)建一個 ServerSocket時,只需為其賦予一個端口編號。但在創(chuàng)建一個客戶端 Socket時,必須同時賦予IP以及要連接的端口。下面這對程序先運行服務器程序,再運行客戶端程序。馬克- to-win:馬克 java社區(qū):防盜版實名手機尾號: 73203。
例:2.2.1(客戶端寫,服務器端讀)
import java.io.*;
import java.net.*;
public class TestMark_to_win {
public static final int PORT = 4002;
public static void main(String[] args) throws IOException {
ServerSocket s = new ServerSocket(PORT);
// Blocks until a connection occurs:
System.out.println("我作為服務器,正等著你");
Socket socket = s.accept();
System.out.println("這句開始打印不出來");
InputStream in = socket.getInputStream();
int i = in.read();
System.out.println("Echoing: " + i);
socket.close();
s.close();
}
}
以下是客戶端程序:
import java.net.*;
import java.io.*;
public class Test {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 4002);
OutputStream out = socket.getOutputStream();
out.write(97);
socket.close();
}
}
輸出結果:
我作為服務器,正等著你
這句開始打印不出來
Echoing: 97
例:2.2.2(客戶端讀寫,服務器端也讀寫)(藍筆為比上一個程序多的部分)
import java.io.*;
import java.net.*;
public class TestMark_to_win {
public static final int PORT = 4002;
public static void main(String[] args) throws IOException {
ServerSocket s = new ServerSocket(PORT);
// Blocks until a connection occurs:
System.out.println("我作為服務器,正等著你");
Socket socket = s.accept();
System.out.println("這句開始打印不出來");
InputStream in = socket.getInputStream();
// Blocks until a connection occurs:
int i = in.read();
System.out.println("服務器端反饋" + i);
OutputStream out = socket.getOutputStream();
out.write(98);
socket.close();
s.close();
}
}
以下是客戶端程序:
import java.net.*;
import java.io.*;
public class Test {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 4002);
OutputStream out = socket.getOutputStream();
out.write(97);
InputStream in = socket.getInputStream();
// Blocks until a connection occurs:
int i = in.read();
System.out.println("客戶端反饋" + i);
socket.close();
}
}
服務器輸出結果:
我作為服務器,正等著你
這句開始打印不出來
服務器端反饋97
客戶端輸出結果:
客戶端反饋98
馬克-to-win:上一個程序是一個helloworld程序,所以我們寫的故意很簡單。下一個程序,我們寫一個稍微有點兒實用性的,可以在客戶端和服務器端傳輸中文的。有一個重要的問題就是:我們?yōu)槭裁从肂ufferedReader而BufferedInputstream。因為 BufferedReader有一個方法是readLine,而在BufferedInputstream當中,沒有這個方法。PrintWriter又是BufferedReader的一對天生好搭檔,里面有個方法:println。這樣客戶端和服務器端就可以每次都傳輸一行數(shù)據(jù),比上個例子每次傳輸一個字節(jié),方便的多了。
例:2.2.3(客戶端讀寫,服務器端也讀寫)
import java.io.*;
import java.net.*;
public class TestMark_to_win {
public static final int PORT = 4002;
public static void main(String[] args) throws IOException {
ServerSocket s = new ServerSocket(PORT);
System.out.println("服務器正等著");
// Blocks until a connection occurs:
Socket socket = s.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
/* autoFlush - A boolean; if true, the println() methods will flush the output buffer*/
PrintWriter out = new PrintWriter((new OutputStreamWriter(
socket.getOutputStream())), true);
String str = in.readLine();
System.out.println("Echoing: " + str);
out.println(str + "回來從服務器");
// Always close the two sockets...
System.out.println("closing...");
socket.close();
s.close();
}
}
下面是客戶端程序:
import java.net.*;
import java.io.*;
public class Test {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 4002);
BufferedReader in = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
/* autoFlush - A boolean; if true, the println() methods will flush the output buffer*/
PrintWriter out = new PrintWriter((new OutputStreamWriter(
socket.getOutputStream())), true);
out.println("你好 ");
String str = in.readLine();
System.out.println(str);
System.out.println("closing...");
socket.close();
}
}
服務器輸出結果:
服務器正等著
Echoing: 你好
closing...
客戶端輸出結果:
你好 回來從服務器
closing...