客戶端:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/**
* 首先創建socket對象client,用於建立和服務器段端的通信;
* 然後通過調用socket的方法獲得遠程服務器地址,
* 利用數據處理流(DatainputStrem、DataOutputStream)處理通信信息並打印
*@package
*@project LearningJava
*/
public class GreetingClient {
public static void main(String[] args) {
String serverName = "localhost";
int port = 6066;
try {
System.out.println("Connecting to " + serverName + "at port" + port);
Socket client = new Socket(serverName, port);
String server_address = client.getRemoteSocketAddress().toString();
System.out.println("Connection to " + server_address);
OutputStream outToserver = client.getOutputStream();
DataOutputStream out = new DataOutputStream(outToserver);
out.writeUTF("Hello from " + client.getLocalAddress());
InputStream inFromserver = client.getInputStream();
DataInputStream in = new DataInputStream(inFromserver);
System.out.println("Says from Server: " + in.readUTF());
client.close();
} catch (IOException e) {
e.getStackTrace();
}
}
}
服務器端:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
/**
* 使用socket實現服務器和客戶端的通信,
* 服務器端創建一個socket對象,客戶端和服務器端通過對這個socket對象讀取和寫入來實現通信
* 通信過程:
*
* 1)服務器實例化一個socket對象(本例中serversocket),通過這個對象實現端口通信;
* 2)服務器端調用serversocket對象的accept方法,這個方法一直等待客戶端連接到服務器給定的端口;
* 3)accept等待時客戶端也實例化一個socket對象,這個對象根據指定的服務器名稱和端口號進行通信;
* 4)通過服務器端的構造方法設定端口和服務器名稱,本例中默認是localhost和6066端口,於是客戶端根據信息創建socket進行通信
* 服務器端accept()返回服務器上一個新的socket引用,這個socket連接到客戶端的socket
*/
public class GreetingServer extends Thread {
private ServerSocket serverSocket;
public GreetingServer(int port) throws IOException {
//通過構造方法設定通信端口
serverSocket = new ServerSocket(port);
serverSocket.setSoTimeout(100000);
}
@Override
public void run() {
while (true) {
try {
System.out.println("Waiting for client on port " + serverSocket.getLocalPort() + "...");
//調用accept方法等待
Socket server = serverSocket.accept();
System.out.println("Just connected to " + server.getRemoteSocketAddress());
//通過處理流來獲取客戶單傳遞過來的信息並打印
DataInputStream in = new DataInputStream(server.getInputStream());
System.out.println(in.readUTF());
DataOutputStream out = new DataOutputStream(server.getOutputStream());
out.writeUTF("Thank you for connecting to " + server.getLocalSocketAddress() + "\nGoodbye!");
//關閉socket
server.close();
} catch (SocketTimeoutException s) {
System.out.println("Socket timed out!");
break;
} catch (IOException e) {
e.printStackTrace();
break;
}
}
}
public static void main(String[] args) {
// System.out.println("input your port: ");
// Scanner scan = new Scanner(System.in);
// int port = 0;
//
// while (scan.hasNextInt()) {
// port = scan.nextInt();
// }
try {
Thread t = new GreetingServer(6066);
t.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}