使用JAVA实现Socket通信,TCP、UDP简析。
2015-12-30 16:39
866 查看
Socket通信是一种非常重要的通信方式,它使用起来简单方便,也很容易学会,下面就我所知道的简单记录一下。
首先是UDP的方式。(通过Android与PC端进行通信)
发送端:
[java] view
plaincopy
package com.zww.socket;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class SocketClient {
public static void main(String[] args) {
try {
// 创建发送方的套接字,IP默认为本地,端口号随机
DatagramSocket sendSocket = new DatagramSocket();
// 确定要发送的消息:
String mes = "你好!接收方!";
// 由于数据报的数据是以字符数组传的形式存储的,所以传转数据
byte[] buf = mes.getBytes();
// 确定发送方的IP地址及端口号,地址为本地机器地址
int port = 11511;
InetAddress ip = InetAddress.getLocalHost();
// 创建发送类型的数据报:
DatagramPacket sendPacket = new DatagramPacket(buf, buf.length, ip,
port);
// 通过套接字发送数据:
sendSocket.send(sendPacket);
// 确定接受反馈数据的缓冲存储器,即存储数据的字节数组
byte[] getBuf = new byte[1024];
// 创建接受类型的数据报
DatagramPacket getPacket = new DatagramPacket(getBuf, getBuf.length);
// 通过套接字接受数据
sendSocket.receive(getPacket);
// 解析反馈的消息,并打印
String backMes = new String(getBuf, 0, getPacket.getLength());
System.out.println("接受方返回的消息:" + backMes);
// 关闭套接字
sendSocket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
接收端:
[java] view
plaincopy
/** * */package com.zww.socket;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketAddress;
/**
* @zww Administrator
*
*/
public class SocketServer {
public static void main(String[] args){
DatagramSocket serverSocket = null;
try {
//确定接收方IP和端口号
InetAddress ip = InetAddress.getLocalHost();
int port = 11511;
//确定接收方的套接字
serverSocket = new DatagramSocket(port, ip);
//创建接收byte[]
byte[] rebuf = new byte[1024];
//创建接收类型数据报
DatagramPacket getPacket = new DatagramPacket(rebuf, rebuf.length);
//通过套接字接收数据
serverSocket.receive(getPacket);
//解析收到的消息
String getMsg = new String(rebuf,0,getPacket.getLength());
System.out.println("收到的消息"+getMsg);
//获取发送方的IP
InetAddress rmIP = getPacket.getAddress();
int rmport = getPacket.getPort();
System.out.println("rmIP:"+rmIP+"rmport:"+rmport);
//获取发送放套接字地址
SocketAddress rmSocket = getPacket.getSocketAddress();
//反馈消息
String res = new String("yes I Have received");
byte[] resbyte = res.getBytes();
//构建发送数据报
DatagramPacket sendPacket = new DatagramPacket(resbyte, resbyte.length ,rmSocket);
//通过套接字发送回复
serverSocket.send(sendPacket);
serverSocket.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
现在介绍TCP的实现过程。
客户端代码:
[java] view
plaincopy
// 1.根据指定的server地址和端口,建立socket连接。
Socket socket = new Socket(server, servPort);
// 2. 根据socket实例获取InputStream, OutputStream进行数据读写。
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
out.write(data);
//3.操作结束,关闭socket.
socket.close();
服务端代码:
[java] view
plaincopy
//1. 构造ServerSocket实例,指定服务端口。
ServerSocket servSock = new ServerSocket(servPort);
while(true)
{
// 2.调用accept方法,建立和客户端的连接
Socket clntSock = servSock.accept();
SocketAddress clientAddress =
clntSock.getRemoteSocketAddress();
System.out.println("Handling client at " + clientAddress);
// 3. 获取连接的InputStream,OutputStream来进行数据读写
InputStream in = clntSock.getInputStream();
OutputStream out = clntSock.getOutputStream();
while((recvMsgSize = in.read(receiveBuf)) != -1)
{
out.write(receiveBuf, 0, recvMsgSize);
}
// 4.操作结束,关闭socket.
clntSock.close();
}
注意一些常见错误,创建同一个socket只能创建一次,第二次使用时无需再次创建,此外socket.close()方法是不能立即释放掉资源的,如果再很短的时间内再次创建被关闭的socket是会出现错误的。
首先是UDP的方式。(通过Android与PC端进行通信)
发送端:
[java] view
plaincopy
package com.zww.socket;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class SocketClient {
public static void main(String[] args) {
try {
// 创建发送方的套接字,IP默认为本地,端口号随机
DatagramSocket sendSocket = new DatagramSocket();
// 确定要发送的消息:
String mes = "你好!接收方!";
// 由于数据报的数据是以字符数组传的形式存储的,所以传转数据
byte[] buf = mes.getBytes();
// 确定发送方的IP地址及端口号,地址为本地机器地址
int port = 11511;
InetAddress ip = InetAddress.getLocalHost();
// 创建发送类型的数据报:
DatagramPacket sendPacket = new DatagramPacket(buf, buf.length, ip,
port);
// 通过套接字发送数据:
sendSocket.send(sendPacket);
// 确定接受反馈数据的缓冲存储器,即存储数据的字节数组
byte[] getBuf = new byte[1024];
// 创建接受类型的数据报
DatagramPacket getPacket = new DatagramPacket(getBuf, getBuf.length);
// 通过套接字接受数据
sendSocket.receive(getPacket);
// 解析反馈的消息,并打印
String backMes = new String(getBuf, 0, getPacket.getLength());
System.out.println("接受方返回的消息:" + backMes);
// 关闭套接字
sendSocket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
接收端:
[java] view
plaincopy
/** * */package com.zww.socket;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketAddress;
/**
* @zww Administrator
*
*/
public class SocketServer {
public static void main(String[] args){
DatagramSocket serverSocket = null;
try {
//确定接收方IP和端口号
InetAddress ip = InetAddress.getLocalHost();
int port = 11511;
//确定接收方的套接字
serverSocket = new DatagramSocket(port, ip);
//创建接收byte[]
byte[] rebuf = new byte[1024];
//创建接收类型数据报
DatagramPacket getPacket = new DatagramPacket(rebuf, rebuf.length);
//通过套接字接收数据
serverSocket.receive(getPacket);
//解析收到的消息
String getMsg = new String(rebuf,0,getPacket.getLength());
System.out.println("收到的消息"+getMsg);
//获取发送方的IP
InetAddress rmIP = getPacket.getAddress();
int rmport = getPacket.getPort();
System.out.println("rmIP:"+rmIP+"rmport:"+rmport);
//获取发送放套接字地址
SocketAddress rmSocket = getPacket.getSocketAddress();
//反馈消息
String res = new String("yes I Have received");
byte[] resbyte = res.getBytes();
//构建发送数据报
DatagramPacket sendPacket = new DatagramPacket(resbyte, resbyte.length ,rmSocket);
//通过套接字发送回复
serverSocket.send(sendPacket);
serverSocket.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
现在介绍TCP的实现过程。
客户端代码:
[java] view
plaincopy
// 1.根据指定的server地址和端口,建立socket连接。
Socket socket = new Socket(server, servPort);
// 2. 根据socket实例获取InputStream, OutputStream进行数据读写。
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
out.write(data);
//3.操作结束,关闭socket.
socket.close();
服务端代码:
[java] view
plaincopy
//1. 构造ServerSocket实例,指定服务端口。
ServerSocket servSock = new ServerSocket(servPort);
while(true)
{
// 2.调用accept方法,建立和客户端的连接
Socket clntSock = servSock.accept();
SocketAddress clientAddress =
clntSock.getRemoteSocketAddress();
System.out.println("Handling client at " + clientAddress);
// 3. 获取连接的InputStream,OutputStream来进行数据读写
InputStream in = clntSock.getInputStream();
OutputStream out = clntSock.getOutputStream();
while((recvMsgSize = in.read(receiveBuf)) != -1)
{
out.write(receiveBuf, 0, recvMsgSize);
}
// 4.操作结束,关闭socket.
clntSock.close();
}
注意一些常见错误,创建同一个socket只能创建一次,第二次使用时无需再次创建,此外socket.close()方法是不能立即释放掉资源的,如果再很短的时间内再次创建被关闭的socket是会出现错误的。
相关文章推荐
- OkHttp 源码分析
- 网络请求
- OkHttp上传文件,服务器端请求解析找不到文件信息的问题
- centos6中iptables单机网络防火墙的使用
- centos6中iptables单机网络防火墙的使用
- Loadrunner之HTTP脚本编写
- java_httpservice
- JMeter学习HTTP属性管理器
- 网络编程(一):用C#下载网络文件的2种方法
- Apache Httpd + Subversion 搭建HTTP访问的SVN服务器
- Apache MINA--使用 Apache MINA 开发高性能网络应用程序
- Android 6.0 使用 Apache HttpClient
- Android网络编程之Internet地址&InetAddress
- 计算机网络学习(二)——传输层
- 网络数据获取 调试
- openstack 虚拟机网络规则设置
- Android HttpURLConnection Post 参数 (https)
- CentOs网络管理:ifconfig家族,iproute家族及配置文件
- 关于 UITableView 中 网络获取图片 cell 自适应高度的问题
- Android广告条效果--使用Volley实现网络图片的自动轮播(仿淘宝、网易广告页轮播效果)