码迷,mamicode.com
首页 > 其他好文 > 详细

Socket网络编程TCP、UDP示例

时间:2014-10-21 17:56:01      阅读:274      评论:0      收藏:0      [点我收藏+]

标签:网络编程   socket   tcp   udp   

Socket网络编程:

 

1) OSI(了解):

国际标准化组织ISO(International Orgnization for Standardization)指定了网络通信的模型:开放系统互联(OSI,Open System Interconnection),把网络通信工作分为七层:物理层(最底层)-数据链路层-网络层-传输层-会话层-表示层-应用层(应用程序)

 

数据格式

功能与连接方式

典型设备

应用层 

 

网络服务与使用者应用程序间的一个接口

 

表示层 

 

数据表示、数据安全、数据压缩

 

会话层 

 

建立、管理和终止会话

 

传输层 

数据组织成数据段Segment

用一个寻址机制来标识一个特定的应用程序(端口号)

 

网络层 

分割和重新组合数据包Packet

基于网络层地址(IP地址)进行不同网络系统间的路径选择

路由器

数据链路层

将比特信息封装成数据帧Frame

在物理层上建立、撤销、标识逻辑链接和链路复用 以及差错校验等功能。通过使用接收系统的硬件地址或物理地址来寻址

网桥、交换机、网卡

物理层

传输比特(bit)流

建立、维护和取消物理连接

光纤、同轴电缆、

双绞线、中继器和集线器

 

2) TCP/IP模型:网络通信协议,将OSI简化为四层:

a. 应用层:

b. 传输层:TCP协议、UDP协议是传输层协议

c. 网络层:IP协议、ICMP协议是传输层协议

d. 网络接口层:

① TCP协议(传输控制协议):

传输层协议。面向连接(需要建立双方会话),可靠的(发送若没收回确认信息,则重新发送),速度慢。建立TCP连接需要三次握手,终止它需要四次握手。例如:web应用,下载文件断点续传。

② UDP协议(用户数据报协议):

传输层协议。面向无连接(只是一方发送),不可靠(只发送不确认,可能会丢包),速度快,将数据压缩成数据包,数据报大小限制在64K以内。如:CS,QQ,在线视频,语音电话。

③ IP协议:

网络层协议。面向无连接。IP地址(IPv4)由4个字节组成,具有唯一性,根据网络号和主机号所占字节数分为ABCDE五类地址。(参考《TCP/IP详解》)

④ ICMP协议:

网络层协议。面向无连接,用于传输出错报告控制信息.比如用于检查网络通不通的Ping命令,“Ping”的过程实际上就是ICMP协议工作的过程。

 

3) Socket网络编程:

① 原理:通过建立一个双向的网络通信连接实现数据交换,通信的两端都称作一个Socket。

② 广泛使用:可以在Linux,Unix,Windows平台使用并且C语言,JAVA都支持Socket。

③ 网络通讯要素:

IP地址、端口号、传输协议

④ JAVA Socket通信需要java.net包下的Socket和ServerSocket实现客户端和服务器端。建立连接所需的寻址信息是远程计算机的IP地址和端口号。

端口号:[了解]端口号占两个字节,一台机器可以存在65536个端口号,端口有什么用呢?我们知道,一台拥有IP地址的主机可以提供许多服务,比如Web服务、FTP服务、SMTP服务等,这些服务完全可以通过1个IP地址来实现。那么,主机是怎样区分不同的网络服务呢?显然不能只靠IP地址,因为IP 地址与网络服务的关系是一对多的关系。实际上是通过“IP地址+端口号”来区 分不同的服务的。 0-1024为系统保留端口,ftp端口是21,smtp端口号25,pop3端口号110,端口号分为TCP端口和UDP端口,每个都有65536个。

⑤ DNS:Domain Name System,域名系统 ,根据主机名找到对于的ip地址。先到C:\Windows\System32\drivers\etc\hosts文件中解析。

⑥ JAVA中使用网络编程:

a. UDP方式:

建立DatagramSocket对象,作为发送端和接收端。利用send和receive方法对数据包进行传输。建立DatagramPacket数据包作为发送和存储信息的载体。通过getData、getPort、getAddress.getHostAddress等方法获取对方数据、对方端口和对方主机ip地址。

b. TCP方式:

建立客户端:建立Socket对象,构造时指定连接的主机的ip地址/主机名、端口。利用getInputStream、getOutputStream方法得到字节输入输出流。



TCP

使用TCP进行网络编程,客户端向服务器端发送一个字符串,

服务器收到该字符串后将其打印到命令行上,然后向客户端返回该字符串的长度,最后,

客户端输出服务器端返回的该字符串的长度。


TCP_client.java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class TCP_client {
	public static void main(String[] args) throws IOException {
		//创建一个流套接字并将其连接到指定 IP 地址/主机名的指定端口号。
		Socket socket = new Socket("lj", 8888);
//		Socket socket = new Socket("127.0.0.1", 8888);
		System.out.println("client started");
		//服务器端发送数据到客户端
		OutputStream outputStream = socket.getOutputStream();
		outputStream.write("啊aaa".getBytes());
		//客户端接收服务器端数据
		InputStream inputStream = socket.getInputStream();
		byte[] buf = new byte[1024];
		int len = inputStream.read(buf);
		String text = new String(buf,0,len);
		System.out.println("length:"+text);
		socket.close();
	}
}
TCP_server.java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TCP_server {
	public static void main(String[] args) throws IOException {
		//创建绑定到特定端口服务器Socket
		ServerSocket serverSocket = new ServerSocket(8888);
		System.out.println("server started...");
		//监听该Socket端口
		 Socket socket = serverSocket.accept();
		 //服务器端接收客户端数据
		 InputStream inputStream = socket.getInputStream();
		 byte[] buf = new byte[1024];
		 int len = inputStream.read(buf);
		 String text = new String(buf,0,len);
		 System.out.println(text);
		 //服务器端发送返回数据到客户端
		 OutputStream outputStream = socket.getOutputStream();
		 outputStream.write(String.valueOf(text.length()).getBytes());
		 serverSocket.close();
	}
}


UDP

使用UDP进行网络编程,客户端向服务器端发送一个字符串,服务器收到该字符串后将其打印到命令行上。


UDP_client.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDP_client {
	public static void main(String[] args) throws IOException {
		DatagramSocket socket = new DatagramSocket(10000);
		System.out.println("client started...");
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
		byte[] buf =reader.readLine().getBytes();
		//第三个参数是发送的指定的Socket端口
		DatagramPacket packet = new DatagramPacket(buf , buf.length,InetAddress.getByName("127.0.0.1"),1111);
		socket.send(packet);//阻塞式
		socket.close();
	}
}


UDP_server.java

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDP_server {
	public static void main(String[] args) throws IOException {
		DatagramSocket socket = new DatagramSocket(1111);
		System.out.println("server started...");
		byte[] buf = new byte[1024];
		DatagramPacket packet = new DatagramPacket(buf,buf.length);//客户端数据包需要指定端口号,服务器端不用指定。
		socket.receive(packet);
		//packet.getPort()返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。
		System.out.println("http://"+packet.getAddress().getHostAddress()+":"+(packet.getPort()));
		System.out.println(new String(packet.getData()));
		socket.close();
	}
}



Socket网络编程TCP、UDP示例

标签:网络编程   socket   tcp   udp   

原文地址:http://blog.csdn.net/so_sss/article/details/40345469

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!