天天看点

黑马程序员 网络编程 UDP与TCP

---------------------- 、、期待与您交流! ----------------------/*

网络编程分为两种模式:tcp和udp

连接互联网的计算机以亿计,为了唯一的标识出每台电脑,互联网就给每台电脑分配一个

唯一独立的ip地址,通过这个ip地址就可以进行计算机之间的数据交换

我们计算机交换的数据功能我们在java中把它封住成一个叫socket的类,

简称套接字,

端口号:计算机数据的交换一般都是电脑上的程序来维护的,而电脑上又运行着很多的

软件,为了唯一的标识这些程序,我们就用16位来表示它,叫做端口号

只要指定ip地址和端口号,那么任意计算机上的软件就能自由的通信

---------------------------------------------------------------------------

tcp简介:

tcp/ip协议是一种可靠的网络协议,它在通信两端各建立一个socket,从而在通信

两端之间形成网络虚拟链路,一旦建立了虚拟网络链路,两端程序就可以通过虚拟链路

通信,java使用socket对象代表两端的通讯端口,并通过socket来产生io流进行

数据的传输

端口有客服端和服务的的明显之分

客服端用socket 服务端用serversocket

socket构造函数(客户端)

socket(string s,int port)指定目标ip地址和端口号

socket(inetaddress in,int port)同上

方法:产生输入输出流:

inputstream getinputstream() 获得输入流

outputstream getoutputstream() 获得输出流

serversocket(服务端)

构造器:

serversocket(in port) 只需指定端口号

方法:

socket accept();等待客服端的请求 获得发送者的端口

注:当服务端接收到客服端的请求的时候,两者就会建立虚拟链路,于是就在两者间

维护了两条流:输入流和输出流

服务端的代码

------------------------------------------------------------------------------

*/

import java.io.*;

import java.net.*;

public class tcpserver

{

public static void main(string[]agrs)throws exception

//服务端端口

serversocket ss=new serversocket(45454);

//等待客服端的请求 并返回发送者的端口

socket s=ss.accept();

//从端口维护的输入流中一行行的读取数据

bufferedreader buf

=new bufferedreader(new inputstreamreader(s.getinputstream()));

string len=null;

while((len=buf.readline())!=null)

system.out.println(len);

}

//客服端的代码-----------------------------------------------------------------

public class tcpclient

public static void main(string[]args)throws exception

socket s=new socket("127.0.0.1",45454);

outputstream os=s.getoutputstream();

//这个是打印流 缓冲作用

printstream ps=new printstream(os);

//从键盘中源源不断的获得数据并一行行的放到端口间的输出流

bufferedreader br=

new bufferedreader(new inputstreamreader(system.in));

while((len=br.readline())!=null)

//如果输入88就停止通讯

if(len.equals("88"))

break;

ps.println(len);

os.close();

s.close();

//---------------------------------------------------------------------------

/*

udp简介:

udp是一种不可靠的网络通信协议,它在通信实例的两端各建立一个socket,

但这两个socket并没有虚拟链路,这两个socket只是负责发送和接收数据报对象,

java提供datagramsocket作为基于udp协议的socket,使用datagramsocket代表socket

完成接收和发送的任务

datagramsocker(int port)默认是绑定本机中的ip地址,并指定其端口号

send(datagrampacket e) 把指定数据报发送出去

receive(datagrampacket e) 接收数据报

datagrampacket:

datagrampacket(byte[]buf,int length)创建一个字节数据用来接收数据包中的数据

datagrampacket(byte[]buf,int length,inetaddress addr,int port)

把数据打包并指定发送的目的地

inetaddress getaddress():获得发送者的ip地址

int getport()获得发送者的端口号

socketaddress getsocketaddress()返回一个封住了ip和端口号的对象

---------------------------------------------------------------------------------

服务端代码:

public class udpserver

datagramsocket ds=new datagramsocket(38383);

//用于存储接收的字节数据

byte []b=new byte[20];

// 把数组创建成数据报的形式用于获取接收来的数据

datagrampacket dp=new datagrampacket(b,b.length);

while(true)

//相当于码头正在等待着货船的靠岸

ds.receive(dp);//如果没有接受到数据报当前线程将一这阻塞着

//解码

string s=new string(b,0,b.length);

//获取发送者的ip地址

inetaddress net=dp.getaddress();

//获取发送者的端口号

int port=dp.getport();

//打印在控制台

system.out.println(net.getname()+port+s);

//服务端代码-------------------------------------------------------------------------------

public class udpclient

//创建一个套接字

datagramsocket ds=new datagramsocket(37373);

//源源不断的从键盘中获得数据

bufferedreader bf=

datagrampacket dp=null;

//将数据一行行的打包成数据报发送到指定目的

while((len=bf.readline())!=null)

b=len.getbytes();

//注意这里的ip地址必须是inetaddress对象封装

dp=new datagrampacket(b,b.length,inetaddress.getlocalhost(),38383);

//把数据报发送出去

ds.send(dp);

//--------------------------------------------------------------------------------------

/*两者的简单比较如下:

tcp协议:可靠,传输大小没有限制,但建立的时候是需要时间的,差错控制开销大:例子:手机通讯

udp协议:不可靠、差错控制开销小,传输大小控制在64kb下,不需要建立时间,出来会快些

例子:呼机*/

----------------------、、期待与您交流!

----------------------