Socket网络编程TCP、UDP演示样例

Socket网络编程:

1) OSI(了解):

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


数据格式


功能与连接方式


典型设备


应用层


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


表示层


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


会话层


建立、管理和终止会话


传输层


数据组织成数据段Segment


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


网络层


切割和又一次组合数据包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地址、port号、传输协议

④ JAVA Socket通信须要java.net包下的Socket和ServerSocket实现client和server端。

建立连接所需的寻址信息是远程计算机的IP地址和port号。

port号:[了解]port号占两个字节。一台机器能够存在65536个port号,port有什么用呢?我们知道。一台拥有IP地址的主机能够提供很多服务,比方Web服务、FTP服务、SMTP服务等,这些服务全然能够通过1个IP地址来实现。那么,主机是如何区分不同的网络服务呢?显然不能仅仅靠IP地址,由于IP 地址与网络服务的关系是一对多的关系。实际上是通过“IP地址+port号”来区 分不同的服务的。

0-1024为系统保留port,ftpport是21,smtpport号25,pop3port号110,port号分为TCPport和UDPport,每一个都有65536个。

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

⑥ JAVA中使用网络编程:

a. UDP方式:

建立DatagramSocket对象。作为发送端和接收端。利用send和receive方法对数据包进行传输。建立DatagramPacket数据包作为发送和存储信息的载体。

通过getData、getPort、getAddress.getHostAddress等方法获取对方数据、对方port和对方主机ip地址。

b. TCP方式:

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

TCP:

一句话:server端绑定(创建Socket时绑定)并监听(accept方法)一个port,client连接到这个port,两者通过各自建立一个socket,利用getOutputStream和getInputStream方法进行write和read,完毕通信,client使用的port是系统随机指定的,不必关心。

使用TCP进行网络编程。client向server端发送一个字符串。

server收到该字符串后将其打印到命令行上,然后向client返回该字符串的长度,最后。

client输出server端返回的该字符串的长度。

TCP_client.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
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");
		//server端发送数据到客户端,从键盘获取该字符串
		System.out.println("请输入字符串:");
		BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
		String line = bufferedReader.readLine();
		OutputStream outputStream = socket.getOutputStream();
		outputStream.write(line.getBytes());
		//客户端接收server端数据
		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);
		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();
		 //服务器端接收client数据
		 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);
		 //服务器端发送返回数据到client
		 OutputStream outputStream = socket.getOutputStream();
		 outputStream.write(String.valueOf(text.length()).getBytes());
		 serverSocket.close();
	}
}

UDP:

一句话。接收端绑定并监听一个port,建立数据包并通过Socket的receive(dp)方法接收,发送端建立数据包并指定接收端ip地址与port。通过Socket的send(dp)方法发送。

发送端使用的port是系统随机指定的,不必关心。

使用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);//client数据包须要指定端口号,服务器端不用指定。

socket.receive(packet);
		//packet.getPort()返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。

System.out.println("http://"+packet.getAddress().getHostAddress()+":"+(packet.getPort()));
		System.out.println(new String(packet.getData()));
		socket.close();
	}
}
时间: 2024-08-27 22:09:05

Socket网络编程TCP、UDP演示样例的相关文章

Socket网络编程(TCP/IP/端口/类)和实例

Socket网络编程(TCP/IP/端口/类)和实例 原文:C# Socket网络编程精华篇 转自:微冷的雨 我们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念: TCP/IP层次模型 当然这里我们只讨论重要的四层 01,应用层(Application):应用层是个很广泛的概念,有一些基本相同的系统级TCP/IP应用以及应用协议,也有许多的企业应用和互联网应用.http协议在应用层运行. 02,传输层(Tanspot):传输层包括UDP和TCP,UDP几乎不对报文进行检查,而

Socket网络编程TCP、UDP示例

Socket网络编程: 1) OSI(了解): 国际标准化组织ISO(International Orgnization for Standardization)指定了网络通信的模型:开放系统互联(OSI,Open System Interconnection),把网络通信工作分为七层:物理层(最底层)-数据链路层-网络层-传输层-会话层-表示层-应用层(应用程序) 数据格式 功能与连接方式 典型设备 应用层 网络服务与使用者应用程序间的一个接口 表示层 数据表示.数据安全.数据压缩 会话层 建

C编程规范, 演示样例代码。

/*************************************************************** *Copyright (c) 2014,TianYuan *All rights reserved. * *文件名: standard.h *文件标识: 编程规范演示样例代码 * *当前版本号:V1.0 *作者:wuyq *完毕日期:20140709 * *改动记录1: //改动历史记录.包含改动日期.版本号号.改动人及改动内容等 *改动日期 版本号号 改动人 改动内

Python Socket 编程——聊天室演示样例程序

上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和client的代码了解主要的 Python Socket 编程模型.本文再通过一个样例来加强一下对 Socket 编程的理解. 聊天室程序需求 我们要实现的是简单的聊天室的样例,就是同意多个人同一时候一起聊天.每一个人发送的消息全部人都能接收到,类似于 QQ 群的功能,而不是点对点的 QQ 好友之间的聊天.例如以下图: 图来自:http://www.ibm.com/developerworks/linux/tu

python 学习5 网络编程-TCP/UDP

摘抄自:廖雪峰的官方网站:http://www.liaoxuefeng.com/ TCP客户端和服务器端代码: #coding=utf-8 #客户端程序TCP 连接 import socket s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect(('127.0.0.1',9999)) print(s.recv(1024)) for data in ['Michael','Tracy','Sarah']: s.send(data

linux网络编程--tcp/udp编程模型

tcp 模型如下: 上面的模型已经很清楚了 具体函数用法就不细说了 请看tcp简单的例子: 其中server.c #include <stdio.h>#include <string.h>#include <stdlib.h>#include <sys/socket.h>#include <sys/types.h>#include <netinet/in.h>#include <arpa/inet.h> #define e

socket 网络编程快速入门(一)教你编写基于UDP/TCP的服务(客户端)通信

因为UNIX和Win的socket大同小异,为了方便和大众化,这里先介绍Winsock编程. socket 网络编程的难点在入门的时候就是对基本函数的了解和使用,因为这些函数的结构往往比较复杂,参数大部分都是结构体,令人难以记忆和理解. 但是一旦我们知道这些函数包括其参数的具体含义,socket网络编程也就变得不是那么复杂.这里不赘述 具体函数的详细含义,网络上有很多的文章,同时笔者建议大家参考 MSDN,对返回值,参数等会有更好的理解. 以下均为单线程的简单实例,多线程的请关注下一篇文章. (

socket 网络编程高速入门(一)教你编写基于UDP/TCP的服务(client)通信

由于UNIX和Win的socket大同小异,为了方便和大众化,这里先介绍Winsock编程. socket 网络编程的难点在入门的时候就是对基本函数的了解和使用,由于这些函数的结构往往比較复杂,參数大部分都是结构体,令人难以记忆和理解. 可是一旦我们知道这些函数包含其參数的详细含义,socket网络编程也就变得不是那么复杂. 这里不赘述 详细函数的详细含义.网络上有非常多的文章.同一时候笔者建议大家參考 MSDN.对返回值,參数等会有更好的理解. 下面均为单线程的简单实例,多线程的请关注下一篇文

linux下C语言socket网络编程简例

转自:http://blog.csdn.net/kikilizhm/article/details/7858405 这里给出在linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到客户端的连接后,发送数据给客户端:客户端在接受到数据后打印出来,然后关闭.程序里有详细的说明,其中对具体的结构体和函数的实现可以参考其他资料. 程序说明: 这里服务器的端口号和ip地址使用固定的设置,移植时可以根据具体情况更改,可以改写为参数传递更好,这里为了方便,使用固定的. 移