TCP/IP socket编程
2016-02-18 12:03
555 查看
先来介绍下网络协议:
TCP/IP
Transmission Control Protocol 传输控制协议
Internet Protocol 互联网协议
UDP
User Datagram Protocol 用户数据协议
连接协议:
分为:
面向连接协议: Connection Oriented Protocol
非连接协议: Connectionless Protocol
1).面向连接协议是指两台电脑在传输数据前,先会建立一个专属的连接。就如电信局的交换机会为打电话双方提供专属连接一样。
Internet上的面向连接协议就是 TCP/IP
特点:确认回应;分组序号;流量控制。
TCP/IP属于可靠性传输,适合不容许有传输错误的网络程序设计使用
2).非连接协议:无专属连接,无分组,容错,距离短,可同时对多台电脑进行数据传输
Internet上的非连接协议就是 UDP
TCP在网络通信上有极强的生命力,例如远程连接( Telnet )和文件传输( FTP )都需要不定长度的数据被可靠地传输。相比之下 UDP 操作简单,而且仅需要较少的监护,因此通常用于局域网高可靠性的分散系统中client/server 应用程序。
Socket 是程序与网络间的一种接口,大部分网络应用程序都是点对点的,所谓点就是服务器端和客户端所执行的程序。 Socket 是用来接收和传送分组的一个端点。
java的 Socket 编程要用到 java.net 包,最常用的是 net 包下的 6 个类: InetAddress( 互联网协议 (IP) 地址 ) 类,Socket( 套接字 ) 类, ServerSocket( 套接字服务器 ) 类, DatagramSocket( 发送和接收数据报包的套接字 ) 类,DatagramPacket( 数据报包 ) 类, MulticastSocket( 多播数据报套接字类用于发送和接收 IP 多播包 ) 类,其中InetAddress 、 Socket 、 ServerSocket 类是属于 TCP 面向连接协议, DatagramSocket 、 DatagramPacket 和MulticastSocket 类则属于 UDP 非连接协议的传送类。
——From: http://cuishen.iteye.com/blog/242842
TCP 通信模型
Socket模型
示例代码:
UdpServer.java
[java] view
plaincopy
package me.bym.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UdpServer {
public static void main(String[] args) {
// 声明UPD socket,即DatagramSocket
DatagramSocket socket = null;
try {
// 产生DatagramSocket对象,制定监听端口
socket = new DatagramSocket(1234);
// 设置消息读取缓冲区
byte data[] = new byte[512];
// 声明和定义UDP数据包,内容是消息缓冲区的内容
DatagramPacket packet = new DatagramPacket(data, data.length);
// 调用阻塞方法receiver接受客户端发来的内容存放到消息缓冲区packet中
socket.receive(packet);
// 打印消息
String msg = new String(packet.getData(), packet.getOffset(),
packet.getLength());
System.out.println(msg);
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 关闭socket
socket.close();
}
}
}
UdpClient.java
[java] view
plaincopy
package me.bym.udp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UdpClient {
public static void main(String[] args) {
DatagramSocket socket = null;
String msg = null;
try {
socket = new DatagramSocket();
// 从标准输入(键盘)读取数据
BufferedReader reader = new BufferedReader(new InputStreamReader(
System.in));
while (!(msg = reader.readLine()).equalsIgnoreCase("exit")) {
// 产生一个InetAddress,内容是服务器端的IP
InetAddress serverAddress = InetAddress.getByName("127.0.0.1");
// 构造要发送消息的数据报, 并制定服务器监听的端口
DatagramPacket packet = new DatagramPacket(msg.getBytes(),
msg.getBytes().length, serverAddress, 1234);
// 发送数据报
socket.send(packet);
}
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
socket.close();
}
}
}
TcpServer.java
[java] view
plaincopy
package me.bym.tcp;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer {
public static void main(String[] args) {
// 声明一个服务器端socket
ServerSocket serverSocket = null;
// 声明一个socket来接受客户端连接
Socket socket = null;
try {
int temp;
// 定义服务器端socket并指定监听端口
serverSocket = new ServerSocket(5937);
// 调用阻塞式方法来获取客户端连接的socket
socket = serverSocket.accept();
// 获取客户端socket的输入流
InputStream inputStream = socket.getInputStream();
// 读取客户端socket的输入流的内容并输出
byte[] buffer = new byte[512];
while ((temp = inputStream.read(buffer)) != -1) {
System.out.println(new String(buffer, 0, temp));
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
socket.close();
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
TcpClient.java
[java] view
plaincopy
package me.bym.tcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class TcpClient {
public static void main(String[] args) {
// 声明一个socket
Socket socket = null;
try {
String msg = null;
// 产生socket对象,制定服务器地址和服务器监听的端口号
socket = new Socket("127.0.0.1", 5937);
// 从标准输入(键盘)读取内容,获取socket的输出流,将读取到的内容放入输出流中
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
OutputStream outputStream = socket.getOutputStream();
while (!(msg = reader.readLine()).equalsIgnoreCase("exit")) {
outputStream.write(msg.getBytes());
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
TCP/IP
Transmission Control Protocol 传输控制协议
Internet Protocol 互联网协议
UDP
User Datagram Protocol 用户数据协议
连接协议:
分为:
面向连接协议: Connection Oriented Protocol
非连接协议: Connectionless Protocol
1).面向连接协议是指两台电脑在传输数据前,先会建立一个专属的连接。就如电信局的交换机会为打电话双方提供专属连接一样。
Internet上的面向连接协议就是 TCP/IP
特点:确认回应;分组序号;流量控制。
TCP/IP属于可靠性传输,适合不容许有传输错误的网络程序设计使用
2).非连接协议:无专属连接,无分组,容错,距离短,可同时对多台电脑进行数据传输
Internet上的非连接协议就是 UDP
TCP在网络通信上有极强的生命力,例如远程连接( Telnet )和文件传输( FTP )都需要不定长度的数据被可靠地传输。相比之下 UDP 操作简单,而且仅需要较少的监护,因此通常用于局域网高可靠性的分散系统中client/server 应用程序。
Socket 是程序与网络间的一种接口,大部分网络应用程序都是点对点的,所谓点就是服务器端和客户端所执行的程序。 Socket 是用来接收和传送分组的一个端点。
java的 Socket 编程要用到 java.net 包,最常用的是 net 包下的 6 个类: InetAddress( 互联网协议 (IP) 地址 ) 类,Socket( 套接字 ) 类, ServerSocket( 套接字服务器 ) 类, DatagramSocket( 发送和接收数据报包的套接字 ) 类,DatagramPacket( 数据报包 ) 类, MulticastSocket( 多播数据报套接字类用于发送和接收 IP 多播包 ) 类,其中InetAddress 、 Socket 、 ServerSocket 类是属于 TCP 面向连接协议, DatagramSocket 、 DatagramPacket 和MulticastSocket 类则属于 UDP 非连接协议的传送类。
——From: http://cuishen.iteye.com/blog/242842
TCP 通信模型
Socket模型
示例代码:
UdpServer.java
[java] view
plaincopy
package me.bym.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UdpServer {
public static void main(String[] args) {
// 声明UPD socket,即DatagramSocket
DatagramSocket socket = null;
try {
// 产生DatagramSocket对象,制定监听端口
socket = new DatagramSocket(1234);
// 设置消息读取缓冲区
byte data[] = new byte[512];
// 声明和定义UDP数据包,内容是消息缓冲区的内容
DatagramPacket packet = new DatagramPacket(data, data.length);
// 调用阻塞方法receiver接受客户端发来的内容存放到消息缓冲区packet中
socket.receive(packet);
// 打印消息
String msg = new String(packet.getData(), packet.getOffset(),
packet.getLength());
System.out.println(msg);
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 关闭socket
socket.close();
}
}
}
UdpClient.java
[java] view
plaincopy
package me.bym.udp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UdpClient {
public static void main(String[] args) {
DatagramSocket socket = null;
String msg = null;
try {
socket = new DatagramSocket();
// 从标准输入(键盘)读取数据
BufferedReader reader = new BufferedReader(new InputStreamReader(
System.in));
while (!(msg = reader.readLine()).equalsIgnoreCase("exit")) {
// 产生一个InetAddress,内容是服务器端的IP
InetAddress serverAddress = InetAddress.getByName("127.0.0.1");
// 构造要发送消息的数据报, 并制定服务器监听的端口
DatagramPacket packet = new DatagramPacket(msg.getBytes(),
msg.getBytes().length, serverAddress, 1234);
// 发送数据报
socket.send(packet);
}
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
socket.close();
}
}
}
TcpServer.java
[java] view
plaincopy
package me.bym.tcp;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer {
public static void main(String[] args) {
// 声明一个服务器端socket
ServerSocket serverSocket = null;
// 声明一个socket来接受客户端连接
Socket socket = null;
try {
int temp;
// 定义服务器端socket并指定监听端口
serverSocket = new ServerSocket(5937);
// 调用阻塞式方法来获取客户端连接的socket
socket = serverSocket.accept();
// 获取客户端socket的输入流
InputStream inputStream = socket.getInputStream();
// 读取客户端socket的输入流的内容并输出
byte[] buffer = new byte[512];
while ((temp = inputStream.read(buffer)) != -1) {
System.out.println(new String(buffer, 0, temp));
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
socket.close();
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
TcpClient.java
[java] view
plaincopy
package me.bym.tcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class TcpClient {
public static void main(String[] args) {
// 声明一个socket
Socket socket = null;
try {
String msg = null;
// 产生socket对象,制定服务器地址和服务器监听的端口号
socket = new Socket("127.0.0.1", 5937);
// 从标准输入(键盘)读取内容,获取socket的输出流,将读取到的内容放入输出流中
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
OutputStream outputStream = socket.getOutputStream();
while (!(msg = reader.readLine()).equalsIgnoreCase("exit")) {
outputStream.write(msg.getBytes());
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
相关文章推荐
- http和socket简介
- Http 信息头
- iOS开发网络数据之AFNetworking使用
- AFNetWork中使用https
- HTTP协议个人理解
- HttpServletRequest中得到各种信息
- 简单理解Socket _http://www.cnblogs.com/dolphinX/p/3460545.html
- meta标签中的http-equiv属性使用介绍
- 如何用70行代码实现深度神经网络算法
- tcpdump文件格式分析
- 和我一起学《HTTP权威指南》——连接管理
- TCP长连接与短连接的区别(转)
- 网络常识之网关
- Linux下java获取CPU、内存、磁盘IO、网络带宽使用率
- Sqlserver远程/网络事务的支持(在触发器中调用远程服务器)
- Spring HTTPInvoker原理猜想(HTTP+序列化)
- Linux网络编程 -- socketpair的使用
- Okhttp设置http缓存,在没有网络的情况下加载http缓存里面的内容
- Codevs_P1237 餐巾问题(线性规划与网络流24题+最小费用最大流)
- 10个linux网络和监控命令