- 描述:网络连接在大多数应用中非常常见,其中以联机游戏最为著名。那么如何实现Client端与Service端的数据交互。
- 难度:初级
- 知识点:
- 1、TCP网络连接
一、介绍
最让程序员知道的连接协议就有TCP和UDP两种协议,其中尤以三次握手四次挥手最为折磨小白,当然我不会去介绍两个协议的内部设定是什么,这里更重要的是如何使用TCP协议(之后的博客还会有更加简单的数据连接方法,这里先讲一种,吃东西要细嚼慢咽)。
简单实现一下,可以稍微看一下,之后的博客里会有更加简单的方法。
二、Android端
创建一个TcpClient.java
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.concurrent.TimeUnit;
public class TcpClient {
private String ip = "192.168.43.214"; //服务器IP
private int port = 12345; //连接密码
public String refresh = null;
public Thread sendThread = null; //发送线程
private String Cdata;
/**
* TCP使用方法
* @param data 传到后台的参数
* @return
*/
public String Transits (String data) {
Cdata = data;
sendThread = new Thread(null , sendWord ,"outputWork");
sendThread.start();
//休眠机制:如果未收到服务器传递的数据,就进行累加休眠,如果超过五秒,判断为网络问题,也有可能是服务器问题
// //重要性:花了四个小时,想出的最简单的处理数据延迟的方案
try {
for (int i = 0 ; refresh == null ; i++) {
TimeUnit.MILLISECONDS.sleep(i);
if (i == 5000) {
refresh = "网络故障!!";
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return refresh;
}
private Runnable sendWord = new Runnable() {
@Override
public void run() {
try {
Socket s = new Socket(ip , port);
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
System.out.println(Cdata);
dos.writeUTF(Cdata.trim());
DataInputStream dis = new DataInputStream(s.getInputStream());
while (true) {
refresh = dis.readUTF();
if (refresh != null) {
System.out.println("返回结果:" + refresh);
dos.close();
dis.close();
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
};
}
三、后端
写一个测试方法TestTcp.java,当没有问题时,就可以封装此方法
public static void main(String[] args) {
new Thread(new TCP()).start();
}
@Override
public void run() {
ServerSocket serverSocket = null;
try {
//服务器准备就绪
serverSocket = new ServerSocket(12345);
} catch (IOException e) {
e.printStackTrace();
}
while (true) {
Socket client = null;
try {
client = serverSocket.accept();
} catch (IOException e) {
e.printStackTrace();
}
try {
DataInputStream dis = new DataInputStream(client.getInputStream());
DataOutputStream dos = new DataOutputStream(client.getOutputStream());
//数据传入时间
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date date = new Date(System.currentTimeMillis());
System.out.println("【" + simpleDateFormat.format(date) + "】");
//获得客户端数据
String getStr = dis.readUTF();
System.out.println("获得:" + client.toString() + "]:\n数据:" + getStr);
//返回处理结果给用户
dos.writeUTF("ok");
//关闭输入流
dis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}