您的位置:首页 > 理论基础 > 计算机网络

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();

}

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: