网络编程的本质是两个设备之间的数据交换,当然,在计算机网络中,设备主要指计算机。数据传递本身没有多大的难度,不就是把一个设备中的数据发送给两外一个设备,然后接受另外一个设备反馈的数据。
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个 socket。建立网络通信连接至少要一对端口号 (socket)。socket 本质是编程接口 (API),对 TCP/IP 的封装,TCP/IP 也要提供可供程序员做网络开发所用的接口,这就是 Socket 编程接口;HTTP 是轿车,提供了封装或者显示数据的具体形式; Socket 是发动机,提供了网络通信的能力。
一个是 ServerSocket,一个是 Socket。服务端和客户端之间通过 Socket 建立连接,之后它们就可以进行通信了。首先 ServerSocket 将在服务端监听某个端口,当发现客户端有 Socket 来试图连接它时,它会 accept 该 Socket 的连接请求,同时在服务端建立一个对应的 Socket 与之进行通信。这样就有两个 Socket 了,客户端和服务端各一个。
对于 Socket 之间的通信其实很简单,服务端往 Socket 的输出流里面写东西,客户端就可以通过 Socket 的输入流读取对应的内容。Socket 与 Socket 之间是双向连通的,所以客户端也可以往对应的 Socket 输出流里面写东西,然后服务端对应的 Socket 的输入流就可以读出对应的内容。
下面是一个例子,客户端读写和服务端读写
- public class Server {
- public static void main(String args[]) throws IOException {
- //定义一个ServerSocket监听在端口8888上
- int port = 8888;
- int i=1; //连接计数
- //server尝试接收其他Socket的连接请求,
- ServerSocket server = new ServerSocket(port);
- //server的accept方法是阻塞式的 ,即等待着客户端的请求
- Socket socket = server.accept();
- System.out.println("连接"+i++);
- //跟客户端建立好连接,我们就可以获取socket的InputStream,从中读取客户端发过来的信息。
- Reader reader = new InputStreamReader(socket.getInputStream());
- char chars[] = new char[64];
- int len;
- StringBuilder sb = new StringBuilder();
- String temp;
- int index;
- while ((len=reader.read(chars)) != -1) {
- temp = new String(chars, 0, len);
- if ((index = temp.indexOf("eof")) != -1) { //遇到eof时就结束接收
- sb.append(temp.substring(0, index));
- break;
- }
- sb.append(temp);
- }
- System.out.println("from client: " + sb);
- //读完后写数据
- Writer writer = new OutputStreamWriter(socket.getOutputStream());
- writer.write("Hello Client:我是服务端输入数据");
- //释放资源
- writer.flush();
- writer.close();
- reader.close();
- socket.close();
- server.close();
- }
- }
- public class Client {
- public static void main(String args[]) throws Exception {
- //为了简单起见,所有的异常都直接往外抛
- String host = "192.168.74.1"; //要连接的服务端IP地址
- int port = 8888; //要连接的服务端对应的监听端口
- //与服务端建立连接
- Socket client = new Socket(host, port);
- //建立连接后就可以往服务端写数据了
- Writer writer = new OutputStreamWriter(client.getOutputStream());
- writer.write("Hello ,我是客户端输入数据");
- writer.write("eof");
- writer.flush();//写完后要记得flush
- //读取来自服务端数据
- Reader reader = new InputStreamReader(client.getInputStream());
- char chars[] = new char[64];
- int len;
- StringBuffer sb = new StringBuffer();
- String temp;
- int index;
- while ((len=reader.read(chars)) != -1) {
- temp = new String(chars, 0, len);
- if ((index = temp.indexOf("eof")) != -1) {
- sb.append(temp.substring(0, index));
- break;
- }
- sb.append(new String(chars, 0, len));
- }
- System.out.println("from server: " + sb);
- writer.close();
- reader.close();
- client.close();
- }
- }
来源: http://www.cnblogs.com/favour/p/7107829.html