簡(jiǎn)介
某同事要用Socket連接外圍系統(tǒng),幫忙寫了個(gè)簡(jiǎn)單的Demo。
包含一個(gè)客戶端和一個(gè)服務(wù)端的,僅是示例,比較簡(jiǎn)陋,服務(wù)端也沒有用多線程。
直接貼代碼了。
服務(wù)端
import java.io.*;
import java.net.*;
/**
* Socket服務(wù)端示例
*/
public class SocketServer {
ServerSocket serverSocket;
Socket connection = null;
ObjectOutputStream out;
ObjectInputStream in;
String message;
void runServer() {
try {
// 創(chuàng)建服務(wù)端監(jiān)聽
serverSocket = new ServerSocket(31313, 10);
// 等待客戶端連接
System.out.println("等待客戶端連接...");
connection = serverSocket.accept();
System.out.println("收到客戶端連接: " + connection.getInetAddress().getHostName());
// 獲取輸入輸出流
out = new ObjectOutputStream(connection.getOutputStream());
out.flush();
in = new ObjectInputStream(connection.getInputStream());
// 連接成功后,首先向客戶端發(fā)成功消息
sendMsg("連接成功");
// 發(fā)送接收消息
do {
try {
message = (String) in.readObject();
System.out.println("client>" + message);
// 發(fā)送退出消息
if (message.equals("bye")) {
sendMsg("bye");
}
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
System.err.println("數(shù)據(jù)格式無(wú)效");
}
} while (!message.equals("bye")); //當(dāng)對(duì)方消息為bye時(shí)退出循環(huán)
} catch (IOException ex) {
ex.printStackTrace();
} finally {
// 關(guān)閉Socket連接
try {
in.close();
out.close();
serverSocket.close();
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
}
void sendMsg(String msg) {
try {
out.writeObject(msg);
out.flush();
System.out.println("server>" + msg);
} catch (IOException ex) {
ex.printStackTrace();
}
}
public static void main(String args[]) {
SocketServer server = new SocketServer();
while (true) {
server.runServer();
}
}
}
客戶端
import java.io.*;
import java.net.*;
/**
* Socket客戶端示例
*/
public class SocketClient {
Socket clientSocket;
ObjectOutputStream out;
ObjectInputStream in;
String message;
void runClient() {
try {
// 連接到服務(wù)端
clientSocket = new Socket("localhost", 31313);
System.out.println("已連接到服務(wù)端");
// 獲取輸入輸出流
out = new ObjectOutputStream(clientSocket.getOutputStream());
out.flush();
in = new ObjectInputStream(clientSocket.getInputStream());
// 發(fā)送接收消息
do {
try {
// 接收消息
message = (String) in.readObject();
System.out.println("server>" + message);
// 發(fā)送消息
sendMsg("hello");
sendMsg("hello again");
// 發(fā)送退出消息
message = "bye";
sendMsg(message);
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
System.err.println("數(shù)據(jù)格式無(wú)效");
}
} while (!message.equals("bye")); //當(dāng)對(duì)方消息為bye時(shí)退出循環(huán)
} catch (UnknownHostException ex) {
ex.printStackTrace();
System.err.println("無(wú)法連接到服務(wù)端");
} catch (IOException ex) {
ex.printStackTrace();
} finally {
// 關(guān)閉Socket連接
try {
in.close();
out.close();
clientSocket.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
void sendMsg(String msg) {
try {
out.writeObject(msg);
out.flush();
System.out.println("client>" + msg);
} catch (IOException ex) {
ex.printStackTrace();
}
}
public static void main(String args[]) {
SocketClient client = new SocketClient();
client.runClient();
}
}