Socket及时通讯小范例

服务端(测试通过)

package org.whu.jay;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(3000);
        while (true) {
            Socket socket = server.accept();
            InputStream input = socket.getInputStream();
            BufferedReader inputReader = new BufferedReader(
                    new InputStreamReader(input));
            String line = inputReader.readLine();
//          input.close();
            System.out.println(line);
            OutputStream output = socket.getOutputStream();
//注意在输出流中添加转义字符来结束输出
            output.write((line + "\n").getBytes("GB2312"));
//          output.close();
        }
    }
}

客户端(测试通过)

loginSocket = new Socket(ip, port);
in = loginSocket.getInputStream();
inputReader =  new BufferedReader(new InputStreamReader(in));
os = loginSocket.getOutputStream();
//注意在输出流中添加转义字符来结束输出            
os.write((username + "," + password + "\n").getBytes("GB2312"));
//os.close();
String content = inputReader.readLine();
Log.d("服务器回执的消息", content);
//in.close();

这里需要注意的几点:
1、不能显式地关闭输入、输出流:

        input.close();
        output.close();

因为在关闭输入、输出流时,对应的socket也会被关闭。下面就是因为关闭输入流,导致socket被关闭,从而不能从socket中得到输出流而报错。

Exception in thread “main” java.net.SocketException: Socket is closed

public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(3000);
        while (true) {
            Socket socket = server.accept();
            InputStream input = socket.getInputStream();
            BufferedReader inputReader = new BufferedReader(
                    new InputStreamReader(input));
            String line = inputReader.readLine();
            input.close();
            System.out.println(line);
            OutputStream output = socket.getOutputStream();
            output.write((line + "\n").getBytes("GB2312"));
//          output.close();
        }
    }

解决这个问题,只需要不关闭输入、输出流即可。但输入、输出流不关闭的话,程序就不知道何时输入、输出结束了,这样会导致程序一直处于等待状态,不能输出我们想要的结果。为了达到真正的及时通讯的目的,服务端和客户端之间建立连接的socket一定不能关闭(也不能通过关闭输入、输出流来间接关闭socket)。我们可以通过在输出流中添加转义字符来最终解决上述问题。客户端和服务也是一样的。

2、Socket输入、输出流
当建立客户端与服务端连接的socket实例时,这个socket对象就有了对应的输入、输出流。输入和输出流可以理解成一条线路的两根分开的独立管道。当连接建立后,不再区分谁是客户端,谁是服务端。下面是A与B互相实时地传送数据的过程:
2.1、A方从socket实例中得到输出流OutputStream,并向输出流中写入要传输给B的数据data。B方先从对应的socket实例中得到输入流InputStream,再从输入流中读取A方传输过来的数据data。这样就实现了及时通讯的第一步,数据data从A传输到B。
2.2、B方得到从A方传输过来的数据data后,同理从socket实例中得到输出流OutputStream,再将数据data写入输出流。A方也要先从对应的socket实例中得到输入流InputStream,再从输入流中读取数据data。其实这个数据data就是在2.1中由A方自己传输给B方的数据。这样就是实现了即时通讯的第二步,数据data从B传输到A(B也可以根据业务需要选择传输给A的数据,并不一定是从A传过来的数据data)。
通过2.1和2.2就能实现A与B之间的及时通讯。

猜你喜欢

转载自blog.csdn.net/whurs/article/details/44886557
今日推荐