客户端:
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();
}
}
}