您的位置:首页 > 职场人生

黑马程序员---有关Socket间的通信过程理解

2012-03-26 23:13 357 查看
这几天学习了一下比较低级一点的网络编程,感觉还不错,没事了,编个小程序也可以自娱自乐一下,呵呵,
突然想把这一块内容梳理一下,希望自己可以加深印象,也希望有啥不对或不好的地方有朋友能指教一下。
网络通信实际上是两个Socket间的通信。
先说一下UDP协议下的数据传输,我们知道UDP是面向无连接的,是不可靠协议,它是将数据封装成包, 按一个个数据报包发送,
且每个数据报包大小限制在64k以内,但它的传输速度快,因此应用是比较多的,最常见的像qq聊天等
在UDP协议下数据基本的发送和接收步骤小程序我总结如下:
发送方:1、建立Socket服务即创建一个DatagramSocket对象,在该对象构造方法中可以指明发送端口号,
如果不指明,系统会自动分配,代码:DatagramSocket ds=new DatagramSocket();或DatagramSocket ds=new DatagramSocket(8888);
此时8888是我随意指定的端口号,说道端口号就说一点。端口号是不同进程的标识,有效端口从0到65535
但0到1024系统使用或保留不用,所以你可以选择其余的,但正在被用的端口不可以指定。
2、提供数据,将数据封包。提供的数据你可以指定,简单到一个字符串,复杂到一堆文件,你也可以通过键盘输入。
为保证效率通常加入缓冲技术,那键盘输入为例,我们知道键盘输入数据为字节数据,而读取数据,字符流较快,
所以我们可以用InputStreamReader将字节转字符,代码可以是这样的:
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
String line=null;
while((line=buf.readLine())!=null)
{
byte[] buf=line.getBytes();
DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("要接收方的主机名"),能处理的那个进程的端口号);
}
3、通过Socket中的send方法将数据包发出去。即:ds.send(dp);
4、将Socket服务关闭:ds.close();
接收方:1、建立Socket服务,方法同上,但此时要将发送方指定的端口绑定在主机上,即在构造函数中将端口号传进去。
2、创建一个数据包用于存储接收到的数据;
byte[] buf=new byte[1024]; DatagramPacket dp=new DatagramPacket(buf,buf.length);
3、通过Socket的receive方法,将接收到的数据存进定义好的包中;
ds.receive(dp);
4、通过包中的方法将数据取出;
String ip=dp.getAddress.getHostAddress();//获取发送方ip地址
String data=new String(dp.getData(),0,dp.getLength());获取数据
5、关闭服务,ds.close();
另一个重要的传输就是TCP协议下的数据传输。我们知道,TCP是面向连接的,是可靠协议,一旦连接成功,
将会形成数据传输通道进行大量数据传输,由于这种连接是建立在三次会话的基础上,所以传输效率稍低。
由于这种传输是交互式的,所以将步骤在代码中体现如下:

//客户端和服务端互动程序,具体细节不再具体展现
//客户端
class TcpClient
{
public static void main(String[] args)
{
//1.建立Socket服务,指明目的主机和端口
Socket s=new Socket("目的主机名,也可以为ip",端口);
//2.数据建立连接后就有了Socket流,输出流就可以通过Socket对象直接获取,就可以往服务端写数据
OutputStream ous=s.getOutputStream();
out.write("服务端,你好".getBytes());
//3.通过Socket对象获取输入流读取服务端给的反馈信息
InputStream ins=s.getInputStream();
byte[] buf=new byte[1024];
int len=ins.read(buf);
System.out.println(new String(buf,0,len));
//4.关闭Socket服务
s.close();
}
}

//服务端
class TcpServer
{
public static void main(String[] args)
{
//1.建立Socket服务,通过创建ServerSocket对象,并监听上个程序中的那个端口
ServerSocket ss=new ServerSocket(端口);
//2.通过ServerSocket的accept方法,接收连接过来的客户端对象
Socket s=ss.accept();
//3.当客户端发来数据时,服务端会使用相应的客户端对象,并通过该对象获取读取流,进行数据的读入
InputStream in=s.getInputStream();
byte[] buf=new byte[1024];
int len=ins.read(buf);
System.out.println(new String(buf,0,len));
//4.通过Socket流获取输出流,给客户端发出反馈信息
OutputStream ous=s.getOutputStream();
ous.write("客户端,你好,来信已收到".getBytes());
//5.关闭服务
s.close();
}
}
如果想提高效率,可在程序中加入缓冲,基于以上基础可以编写小小聊天程序,
或者是模拟客户端,或者服务端。如果将发送和收到的数据改的更有意义,过程再优化一下就更好了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: