首先贴出来我的项目结构。非常简单,new一个java project,在src下建一个名为socketDemo的package。在包里有两个java文件,一个是客户端,一个是服务端。
第二步,就是完场客户端和服务端的代码了。
服务端:
package socketDemo;
import java.io.*;
import java.net.*;
public class TcpServer {
private ServerSocket ss;
private Socket socket;
private BufferedReader in;
private PrintWriter out;
public TcpServer(){
try {
ss = new ServerSocket(8889);
while(true){
//等待连接请求
socket = ss.accept();
//获取ip和端口
String remoteIP = socket.getInetAddress().getHostAddress();
String remotePort = ":"+socket.getLocalPort();
System.out.println("客户端请求IP为 :"+remoteIP+remotePort);
//获取请求过来的数据
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line = in .readLine();
System.out.println("客户端的请求信息 :"+ line);
//返回处理信息
out= new PrintWriter(socket.getOutputStream(),true);
out.println("服务端已收到请求信息!");
out.close();
in.close();
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args){
new TcpServer();
}
}
客户端:
package socketDemo;
import java.io.*;
import java.net.*;
public class TcpClient {
Socket socket;
BufferedReader in;
PrintWriter out;
public TcpClient(){
try {
System.out.println("尝试连接服务器ip端口 127.0.0.1:8889");
socket = new Socket("127.0.0.1",8889);
System.out.println("客户端已经成功连接至服务器");
//请求信息拼接
String ipRequest = "{123456789012345678}{127.0.0.1}{1234}";
String requestLength = String.format("%04d", ipRequest.length());//获取长度,不足的补0,如长度56,则输出0056
ipRequest = requestLength+ipRequest;
System.out.println("发送给服务端的信息是:"+ipRequest);
InputStream in_withcode = new ByteArrayInputStream(ipRequest.getBytes());
BufferedReader line = new BufferedReader(new InputStreamReader(in_withcode));
out = new PrintWriter(socket.getOutputStream(),true);
out.println(line.readLine());
//获取服务端返回信息
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(in.readLine());
out.close();
in.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args){
new TcpClient();
}
}
好了,客户端服务端都写好了,接下来先右键运行服务端,这时候控制台什么都不会输出,是一直等待接收客户端的连接。再右键运行客户端,就可以看见客户端和服务端的控制台分别输出了请求信息。到这里整个demo就已经整理完毕。
我自己做的时候情况是别人提供了一个socket接口并告诉我接口ip地址、端口和请求码,我需要做的是通过请求他们的接口获取我需要的信息。而他们的接口由于网络限制,只接收特定的ip。所以,我需要先确定我能连上他们的接口,然后再给他们发送请求。简单的尝试可以直接telnet他们的ip和端口,如果通了就给他们发送测试信息。
有空我会再补充上socket接口的具体原理。