本篇文章主要介绍了"Java编程之揭开Socket编程的神秘面纱",主要涉及到方面的内容,对于Javajrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播感兴趣的同学可以参考一下:
对TCP/IP、UDP、Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵。那么我想问:什么是TCP/IP、UDP?Socket在...
对TCP/IP、UDP、Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵。那么我想问:
- 什么是TCP/IP、UDP?
- Socket在哪里呢?
- Socket是什么呢?
- 你会使用它们吗?
什么是TCP/IP、UDP?
TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。
UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。
这里有一张图,表明了这些协议的关系:

TCP/IP协议族包括运输层、网络层、链路层。现在你知道TCP/IP与UDP的关系了吧。
Socket在哪里呢?
在图1中,我们没有看到Socket的影子,那么它到底在哪里呢?还是用图来说话,一目了然。

原来Socket在这里。
Socket是什么呢?
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
你会使用它们吗?
前人已经给我们做了好多的事了,网络间的通信也就简单了许多,但毕竟还是有挺多工作要做的。以前听到Socket编程,觉得它是比较高深的编程知识,但是只要弄清Socket编程的工作原理,神秘的面纱也就揭开了。
一个生活中的场景。你要打电话给一个朋友,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了连接,就可以讲话了。等交流结束,挂断电话结束此次交谈。 生活中的场景就解释了这工作原理,也许TCP/IP协议族就是诞生于生活中,这也不一定。

先从服务器端说起:“服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束”。
在这里我就举个简单的例子,我们走的是TCP协议这条路(见图2):
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
import java.text.MessageFormat;
/**
* 服务器端
* Created by ZaneLove on 2015/3/12.
*/publicclassTCPEchoServer {privatestaticfinalint BUFSIZE = 32;
publicstaticvoidmain(String[] args) throws IOException {
//从控制台获取需要监听的端口号if(args.length != 1) {
thrownew IllegalArgumentException("Parameter(s):");
}
//获取端口号int serverPort = Integer.parseInt(args[0]);
//实例化一个ServerSocket
ServerSocket serverSocket = new ServerSocket(serverPort);
System.out.println(MessageFormat.format("开始启动监听,端口号:{0}",args[0]));
//初始接收数据的总字节数int recvMsgSize;
//接收数据的缓冲区byte[] receiveBuf = newbyte[BUFSIZE];
//循环迭代,监听端口号,处理新的连接请求while(true) {
//阻塞等待,每接收到一个请求就创建一个新的连接实例
Socket cIntSocket = serverSocket.accept();
//获取连接的客户端的SocketAddress
SocketAddress clientAddress = cIntSocket.getRemoteSocketAddress();
//打印输出连接客户端地址信息
System.out.println("Handing client at"+clientAddress);
//从客户端接收数据的对象
InputStream in = cIntSocket.getInputStream();
//向客户端发送数据的对象
OutputStream out = cIntSocket.getOutputStream();
//读取客户端发送的数据后,再发送到客户端while((recvMsgSize = in.read(receiveBuf))!=-1) {
out.write(receiveBuf,0,recvMsgSize);
}
//客户端关闭连接时,关闭连接
System.out.println("客户端关闭连接");
cIntSocket.close();
}
}
}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.SocketException;
/**
* Created by ZaneLove on 2015/3/12.
*/publicclassTCPEchoClient {publicstaticvoidmain(String[] args) throws IOException {
//判断从控制台接受的参数是否正确if(args.length < 2 || args.length > 3) {
thrownew IllegalArgumentException("Parameter(s)[]");
}
//获取服务器地址
String server = args[0];
//获取需要发送的信息byte[] data = args[1].getBytes();
//如果有三个从参数那么就获取发送信息的端口号,默认端口号为8099int serverPort = (args.length == 3)?Integer.parseInt(args[2]):8099;
//根据服务器地址和端口号实例化一个Socket实例
Socket socket = new Socket(server,serverPort);
System.out.println("Connected to server ... sending echo string");
//返回此套接字的输入流,即从服务器接受的数据对象
InputStream in = socket.getInputStream();
//返回此套接字的输出流,即向服务器发送的数据对象
OutputStream out = socket.getOutputStream();
//向服务器发送从控制台接收的数据
out.write(data);
//接收数据的计数器,将写入数据的初始偏移量int totalBytesRcvd = 0;
//初始化接收数据的总字节数int bytesRcvd;
while(totalBytesRcvd < data.length) {
//服务器关闭连接,则返回-1,read方法返回接收数据的总字节数if((bytesRcvd = in.read(data,totalBytesRcvd,data.length-totalBytesRcvd))==-1) {
thrownew SocketException("与服务器连接已关闭");
}
totalBytesRcvd += bytesRcvd;
}
//打印服务器发送来的数据
System.out.println("Received:"+new String(data));
//关闭连接
socket.close();
}
}
首先运行服务器端,监听8099端口:

接着运行客户端程序,并且向服务器端发送消息:

再次查看我们的服务器端控制台,我们可以看到前面客户端连接的地址信息:

扩展学习:
①、ISO/OSI网络体系结构和TCP/IP协议模型:http://blog.csdn.net/htyurencaotang/article/details/11473015
②、多线程编程那些事:http://blog.csdn.net/feixiaoxing/article/category/935718
以上就介绍了Java编程之揭开Socket编程的神秘面纱,包括了方面的内容,希望对Javajrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播有兴趣的朋友有所帮助。
本文网址链接:http://www.codes51.com/article/detail_118136.html