这里对Socket的TCP UDP进行一下总结 以及一个UDP的demo
TCP UDP的区别:(考点)
是否需要客户端与服务端建立连接后才能进行数据传输
详细的流程:
TCP流程->
传输前先开服务器,accept等待用户接入,获得客户端socket 进行IO操作 ->socket.getInputStream or socket.getOutputStream
UDP流程->
以数据报作为传输载体,在进行传输时将数据定义为数据报(Datagram)在数据报中指明要到达的主机地址和端口号 将数据以数据报形式发送
ok ,最后以一个demo结束本章节 希望能够对正在观看的小伙伴有所帮助 详细的实现请看注释(超级详细)
eclipse服务端
public class UDPService {
//Socket UDP通信服务段实现的流程
//Step 1:创建DatagramSocket,指定端口号
//Step 2:创建DatagramPacket
//Step 3:接收客户端发送的数据信息
//Step 4:读取数据
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
/*
* 服务端接收客户端数据
*/
//1.创建DatagramSocket,指定端口号
DatagramSocket socket = new DatagramSocket(12306);
// 2.创建数据报,用于接收客户端发送的数据
byte[] data = new byte[1024];// 创建字节数组,指定接收的数据包的大小
DatagramPacket packet = new DatagramPacket(data, data.length);
// 3.接收客户端发送的数据
System.out.println("****服务器端已经启动,等待客户端发送数据");
socket.receive(packet);// 此方法在接收到数据报之前会一直阻塞
//4.读取数据
String info = new String(data, 0, packet.getLength());
System.out.println("我是服务器,客户端说:" + info);
/*
* 向客户端响应数据
*/
// 1.定义客户端的地址、端口号、数据
InetAddress address = packet.getAddress();
int port = packet.getPort();
byte[] data2 = "欢迎您!".getBytes();
// 2.创建数据报,包含响应的数据信息
DatagramPacket packet2 = new DatagramPacket(data2, data2.length, address, port);
// 3.响应客户端
socket.send(packet2);
// 4.关闭资源
socket.close();
}
}
这是的意思是 首先对于客户端的数据进行读取 然后在向客户端进行数据的响应
android 客户端
主要的逻辑
public class UdpClientThread extends Thread {
//IP地址
private String mAddress;
//端口
private int port;
//发送内容
private Handler mHandler;
public UdpClientThread(Handler handler, String address, int port) {
this.mHandler = handler;
this.mAddress = address;
this.port = port;
}
@Override
public void run() {
super.run();
sendSocket();
}
private void sendSocket() {
try {
/*******************发送数据***********************/
/*
* 向服务器端发送数据
*/
// 1.定义服务器的地址、端口号、数据
InetAddress address = InetAddress.getByName(mAddress);
byte[] data = "用户名:admin;密码:123".getBytes();
// 2.创建数据报,包含发送的数据信息
DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
// 3.创建DatagramSocket对象
DatagramSocket socket = new DatagramSocket();
// 4.向服务器端发送数据报
socket.send(packet);
/*******************接收数据***********************/
/*
* 接收服务器端响应的数据
*/
// 1.创建数据报,用于接收服务器端响应的数据
byte[] data2 = new byte[1024];
DatagramPacket packet2 = new DatagramPacket(data2, data2.length);
// 2.接收服务器响应的数据
socket.receive(packet2);
// 3.读取数据
// String reply = new String(data2, 0, packet2.getLength());
// Log.i("statewow","我是客户端,服务器说:" + reply);
sendMsg(0,new String(data2, 0, data2.length));
// 4.关闭资源
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private void sendMsg(int i, Object s) {
Message msg = new Message();
msg.what = i;
msg.obj = s;
mHandler.sendMessage(msg);
}
}
Activity:
public class UDPSpcket extends AppCompatActivity {
private String mAddress = "192.168.30.83";
private int port = 12306;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_udpspcket);
initView();
}
private void initView() {
UdpClientThread mThread = new UdpClientThread(mHandler, mAddress, port);
mThread.start();
}
/**
* Handler
*/
private Handler mHandler = new Handler(Looper.myLooper()) {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0: {
String content = (String) msg.obj;
Log.i("dagejiuwo","@"+content);
break;
}
}
}
};
}