Java Socket編程筆記
1.使用 TCP 連接的demo
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 基於TCp的Socket通信,實現用戶登錄
* 服務器端
*/
public class Server {
public static void main(String[] args) {
try {
//創建一個服務器socket,即serversocket,指定綁定的端口,並監聽此端口
ServerSocket serverSocket = new ServerSocket(8888);
//調用accept()方法開始監聽,等待客戶端的連接
System.out.println("***服務器即將啓動,等待客戶端的連接***");
Socket socket = serverSocket.accept();
//獲取輸入流,並讀入客戶端的信息
InputStream in = socket.getInputStream(); //字節輸入流
InputStreamReader inreader = new InputStreamReader(in); //把字節輸入流轉換爲字符流
BufferedReader br = new BufferedReader(inreader); //爲輸入流添加緩衝
String info = null;
while((info = br.readLine())!=null){
System.out.println("我是服務器,客戶端說:"+info);
}
socket.shutdownInput();//關閉輸入流
//獲取輸出流,相應客戶端的信息
OutputStream outputStream = socket.getOutputStream();
PrintWriter printWriter = new PrintWriter(outputStream);//包裝爲打印流
printWriter.write("歡迎您!");
printWriter.flush(); //刷新緩衝
socket.shutdownOutput();
//關閉資源
printWriter.close();
outputStream.close();
br.close();
inreader.close();
in.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Client類的實現:
import java.io.*;
import java.net.Socket;
/**
* 客戶端
*/
public class Client {
public static void main(String[] args) {
//創建客戶端socket建立連接,指定服務器地址和端口
try {
Socket socket = new Socket("127.0.0.1",8888);
//獲取輸出流,向服務器端發送信息
OutputStream outputStream = socket.getOutputStream();//字節輸出流
PrintWriter pw = new PrintWriter(outputStream); //將輸出流包裝爲打印流
pw.write("用戶名:admin;密碼:123");
pw.flush();
socket.shutdownOutput();
//獲取輸入流,讀取服務器端的響應
InputStream inputStream = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
String info = null;
while((info = br.readLine())!=null){
System.out.println("我是客戶端,服務器說:"+info);
}
socket.shutdownInput();
//關閉資源
br.close();
inputStream.close();
pw.close();
outputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.使用 UDP 連接的demo
/**
* 服務器端的實現
*/
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UDPServer {
public static void main(String[] args) {
try {
//服務器端接收來自客戶端的數據
//創建服務器端的DatagramSocket,指定端口
DatagramSocket socket = new DatagramSocket(8800);
//創建數據報,用於接收客戶端發送的信息
byte[] data = new byte[1024];//創建字節數組,指定接收的數據包的大小
DatagramPacket packet = new DatagramPacket(data,data.length);
//接收客戶端發送的數據
socket.receive(packet); //接收到數據包之前會一直阻塞,會把數據存入packet的data
//讀取數據
String info = new String(data,0,packet.getLength()); //讀取數據
System.out.println("I am Server,Client say:"+info);
//接收到數據後,服務器端響應給客戶端,基本與client的發送相同
//定義客戶端的ip地址,端口號,數據
InetAddress address = packet.getAddress();
int port = packet.getPort(); //port難道不應該肯定是8800???
byte[] data2 = "Welcome".getBytes();
DatagramPacket packet1 = new DatagramPacket(data2,data2.length,address,port);
socket.send(packet1);
socket.close();//關閉資源
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
UDPClient:
import java.io.IOException;
import java.net.*;
/**
* 客戶端實現
*/
public class UDPClient {
public static void main(String[] args) {
try {
//定義服務器的ip,端口號,數據
InetAddress inetAddress = InetAddress.getByName("localhost");
int port = 8800;
byte[] data = "用戶名:admin;密碼:123".getBytes();
//創建數據包,包含要發送的信息
DatagramPacket packet = new DatagramPacket(data,data.length,inetAddress,port);
//創建datagramsocket
DatagramSocket socket = new DatagramSocket();
//使用socket向服務器端發送數據包
socket.send(packet);
//socket.close();
//接收服務器端的響應,基本與Server的接收相同
byte[] dataR = new byte[1024]; //創建數據包用於接收服務器端的響應
DatagramPacket packet1 = new DatagramPacket(dataR,dataR.length);
socket.receive(packet1); //接收響應的數據
String info = new String(dataR,0,packet1.getLength()); //讀取數據
System.out.println("I am Client,Sever reply:"+info);
socket.close();//關閉資源
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}