TCP/IP协议是一种可靠的网络协议,它在通信的两端各建立一个socket,从而在通信的两端形成网络虚拟链路。两端的程序就可以通过虚拟链路通信。java使用socket对象来代表两端的通信接口。并通过socket产生I/O流来进行网络通信
IP协议是Internet上使用的一个关键协议,通过使用IP协议,使Internet成为一个允许连接不同类型的计算机和不同操作系统的网络
TCP协议被称为一种端对端协议,提供可靠并且无差错的通讯服务。当一台计算机需要与另一台远程计算机连接时,TCP协议会让它们建立一个连接:用于发送和接受数据的虚拟链路
- 使用ServerSocket创建TCP服务器端
首先在eclipse上建一个java工程,里面一个类和一个线程,如下
package test;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import thread.ServerThread;
public class MainClass {
// public static ArrayList<Socket> sockets = new ArrayList();
public static void main(String[] args){
try {
//创建一个serverSocket用于监听客户端socket的连接请求
ServerSocket ss = new ServerSocket(30000);
//采用循环不断接受来自客户端的请求
while(true){
//每当接收到客户端的socket请求,服务端也对应产生一个socket,此行代码会堵塞,将一直等待别人的连接
Socket socket = ss.accept();
// sockets.add(socket);
//每当客户端连接成功后,启动一条线程为该客户端服务
new Thread(new ServerThread(socket)).start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package thread;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.ServerSocket;
import java.net.Socket;
import test.MainClass;
public class ServerThread implements Runnable {
Socket s = null;//定义当前线程所处理的socket
BufferedReader br = null;//该线程所处理的socket所对应的输入流
public ServerThread(Socket s) {
this.s = s;
//初始化该socket对应的输入流
try {
br = new BufferedReader(new InputStreamReader(s.getInputStream(),"utf-8"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void run() {
// TODO Auto-generated method stub
String content = null;
//采用循环不断从socket中读取客户端发送过来的数据
while((content=readFromClient())!=null){
OutputStream ops = null;
System.out.print(content);
try {
ops = s.getOutputStream();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if("测试成功".equals(content)){
ops.write(("恭喜你!!!"+"\n").getBytes("utf-8"));
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private String readFromClient (){
try {
return br.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
}
return null;
}
}
代码中详细说明了过程
1.创建一个serverSocket用于监听客户端socket的连接请求
ServerSocket ss = new ServerSocket(30000);
2.每当接收到客户端的socket请求,服务端也对应产生一个socket,此行代码会堵塞,将一直等待别人的连接
Socket socket = ss.accept();
3.每当客户端连接成功后,启动一条线程为该客户端服务
new Thread(new ServerThread(socket)).start();
4.采用循环,不断从socket中读取客户端发送过来的数据
while((content=readFromClient())!=null){
5.如果客户端发送的信息是“测试成功“,就返回它一条信息”恭喜你!!!“
if(“测试成功”.equals(content)){
ops.write((“恭喜你!!!”+”\n”).getBytes(“utf-8”));
}
- TCP客户端
- 建议连接到远程服务器的socket,192.168.1.102是远程服务器端的ip
socket = new Socket(“192.168.1.102”, 30000); - //启动一个线程处理服务器响应的数据
- 建议连接到远程服务器的socket,192.168.1.102是远程服务器端的ip
new Thread() {
@Override
public void run() {
String content = "";
try {
//采用循环,不断从socket中读取服务端发送过来的数据
while ((content = br.readLine()) != null) {
sendMsg(content, 0);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
3.采用循环,不断从socket中读取服务端发送过来的数据
while ((content = br.readLine()) != null) {
4.读取到服务端发送过来的数据后显示
mDisplayContent.setText(obj0);
向服务端发送数据
``
if (ops != null) {
try {
ops.write((obj + "\r\n").getBytes("utf-8"));
} catch (Exception e) {
e.printStackTrace();
}
}
测试的时候先将服务器端的java程序运行,再开启软件,将测试信息”测试成功“发送到服务端,查看是否显示服务端的回执”恭喜你!!!“
最后,注意别忘记加internet权限。
客户端的代码提交到github:https://github.com/DevelopTogether/SocketTest.git
“