使用JAVA寫的一個簡易TCP通訊程式(一)
阿新 • • 發佈:2019-02-15
好記性不如賴筆頭…………
使用TCP測試通訊時,注意必須 先啟動服務端,否則客戶端會報錯。因為TCP是需要三次握手的協議,如果伺服器沒有啟動,握手失敗,就會提示“連線異常”的錯誤
而UDP就沒有這個問題,因為它是一種廣播式的協議,在傳送資訊前,它不會去檢查伺服器有沒有啟動、存在不存在,它只是把訊息發出去,好了,它的工作完成了,不管訊息被 收到還是沒有被收到。所以它才可以不用管啟動順序。
服務端程式碼:
package com.ckinghan.tcpServer;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
//指定介面
public int port;
//構造方法
public TCPServer(int port) {
super();
this.port = port;
//建立執行緒並啟動
Server server = new Server();
Thread thread = new Thread(server);
thread.start();
}
class Server implements Runnable{
@Override
public void run() {
//建立物件
ServerSocket serverSocket = null;
Socket socket = null;
BufferedReader reader =null ;
try {
//例項化物件
serverSocket = new ServerSocket(port);
//提示服務端啟動
System.out.println("埠號為:"+port+"的服務啟動成功……");
//監聽並獲取socket
socket = serverSocket.accept();
//獲取輸入流
InputStream inputStream = socket.getInputStream();
//將位元組流轉換為字元流
reader = new BufferedReader(new InputStreamReader(inputStream));
//獲取IP
InetAddress inetAddress = serverSocket.getInetAddress();
//接收到的資訊
String message = null;
//一直迴圈獲取訊息
while (true) {
//如果接收到的訊息不為Null
if((message = reader.readLine()) != null){
//如果接收到的訊息為close或exit,則退出對話
if("close".equals(message.toLowerCase()) || "exit".equals(message.toLowerCase())){
System.out.println(inetAddress.getHostAddress()+" 的使用者已退出會話");
break;
}
//輸出會話的內容
System.out.println(inetAddress.getHostAddress()+" 的使用者說:"+message);
}
}
} catch (IOException e) {
e.printStackTrace();
}finally {
//關閉流
try {
if(reader != null)
reader.close();
if(socket != null)
socket.close();
if(serverSocket != null)
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
//啟動服務端
new TCPServer(12000);
}
}
客戶端程式碼:
package com.ckinghan.tcpServer;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class TCPClient {
//連線的伺服器IP
private String ip;
//連線伺服器的埠
private int port;
//構造 方法
public TCPClient(String ip,int port) {
super();
this.ip = ip;
this.port = port;
//建立執行緒並啟動
Client client = new Client();
Thread thread = new Thread(client);
thread.start();
}
class Client implements Runnable{
@Override
public void run() {
//建立物件
Socket socket = null;
BufferedWriter bufferedWriter = null;
BufferedReader bufferedReader = null;
try {
//例項化物件
socket = new Socket(ip, port);
//獲取socket的輸出流,以便將內容傳送給伺服器
bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//從控制檯接收內容
bufferedReader = new BufferedReader(new InputStreamReader(System.in));
//要傳送的內容
String message = null;
//一直迴圈
while (true) {
//提示輸入
System.out.print("我說:");
//如果使用者要傳送的資訊不為null
if((message = bufferedReader.readLine()) != null){
//換行
System.out.println();
//檢查使用者是否要退出
if("exit".equals(message.toLowerCase()) || "close".equals(message.toLowerCase())){
System.out.println("退出會話成功");
break;
}
//向伺服器寫入要傳送的訊息
bufferedWriter.write(message);
//注意:這裡是重點,換行
bufferedWriter.newLine();
//清空快取將資訊傳送過去
bufferedWriter.flush();
}
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//關閉流
try {
if(bufferedWriter != null)
bufferedWriter.close();
if(bufferedReader != null)
bufferedReader.close();
if(socket != null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
new TCPClient("127.0.0.1",12000);
}
}