TCP编程可以实现QQ基本功能
因为JAVA可提供实现网络接口的功能,具体类是ServerSocket(服务器Socket)、Socket(客户端Socket)。实现网络拓扑初始设计如下图
第一步,服务器端启动ServerScoket,来接受客户端请求,端口号为30001。
ServerSocket server=new ServerSocket(30001);
while(true)
{
System.out.println("服务器等待中.......");
Socket socket=server.accept();
System.out.println("服务器接到一个客户端连接");
}
第二步,客户端启动Socket,向服务器端发送连接请求
client.socket=new Socket("192.168.100.156",30001);
很显然,三次握手是在这一步进行的。
第三步,之前阻塞的accept方法运行,服务器端打印"服务器接到一个客户端连接",证明已经完成了。
第四步,如何知道客户端IP呢?
可以在服务器端加入如下代码
socket.getInetAddress().getHostAddress();
第五步,客户端如何发送信息到服务器端呢?服务器端如何接受客户端的消息呢?
实际上都是和socket打交道,可以通过socket.getOutputStream()与socket.getInputStream进行消息转换,将客户端敲打出来的文字输出为socket中的流,然后将socket中的流传递到服务器端,转化为文字进行输出。
第六步,那么客户端如何断开连接?
可以把流关掉即可
具体实现代码如下:
服务器端:
package Net.TCP;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket server=new ServerSocket(30002);
while(true)
{
System.out.println("服务器等待中.......");
Socket socket=server.accept();
System.out.println("接收到一个客户端信号"+socket.getInetAddress().getHostAddress()+" 名称是: "+socket.getInetAddress().getHostName());
BufferedReader fromClient=new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedReader message=new BufferedReader(new InputStreamReader(System.in));
String line=fromClient.readLine();
while(line!=null&&!line.equals("exit"))
</span> {
System.out.println(socket.getInetAddress().getHostAddress()+":"+line);
line=fromClient.readLine();
}
System.out.println(socket.getInetAddress().getHostAddress()+"退出");
message.close();
fromClient.close();
}
}
}
客户端:
package TCP;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class TCPClient {
Socket socket;
public void communicate() throws IOException
{
BufferedReader message;
PrintWriter toServer;
BufferedReader fromServer;
while(true)
{
message=new BufferedReader(new InputStreamReader(System.in));
toServer=new PrintWriter(socket.getOutputStream());
// fromServer=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String readline=message.readLine();
while(!readline.toLowerCase().equals("end")&&!readline.toLowerCase().equals("exit"))
{
//发送数据是这样的
toServer.println(readline);
toServer.flush();
readline=message.readLine(); //从系统标准输入读入一字符串
}
if(readline.equals("exit"))
break;
}
message.close();
toServer.close();
System.out.println("断开连接");
}
public static void main(String[] args) throws UnknownHostException, IOException {
TCPClient client=new TCPClient();
client.socket=new Socket("192.168.100.156",30002);
// client.socket.setSoTimeout(1000);
System.out.println("一个客户端socket启动。。。。.......");
client.communicate();
}
}