同时通过Java套接字编写

时间:2018-02-03 15:14:17

标签: java multithreading sockets

此应用程序为其接收的每个连接启动一个新线程,在此示例中,2个客户端(连接)尝试将变量每次增加10次。

所以最后它应该是20,而不是它只有10。

服务器侦听器:

public static void main(String[] args) throws Exception {
        ServerSocket serverSocket = new ServerSocket(1994);
            Socket socket=null;

                while (true) {
                    socket = serverSocket.accept();
                            new TestingSession(socket).start();

            }
        }

服务器主题(会话)

class TestingSession extends Thread {
    private Socket socket;
    TestingSession(Socket socket) {  this.socket = socket;}
    public void run() {
                try {
                    DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
                    DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
            while (!socket.isClosed()) {

                dataOutputStream.writeInt(number.getI());
                int i = dataInputStream.readInt();
                number.setI(i);
                System.out.println(i);

客户主要方法:

public class Run {
    public static void main(String[] args) {

        UpdateTest t1 = new UpdateTest();
        UpdateTest t2 = new UpdateTest();
        t1.start();
        t2.start();
        System.out.println("finished creation");

    }
}

客户线程:

public class UpdateTest extends Thread {

    public void run() {


        try {

            Socket socket;
            socket = new Socket("127.0.0.1", 1994) ;
            for(int i=0; i <10;i++){

                int z=dataInputStream.readInt(); // read the static num
                dataOutputStream.writeInt(z+1); // write it incremented one
          }

            socket.close();


         }  catch(Exception e){
            System.out.println(e.getMessage());
        }

}

}

我希望变量变为20,但它会在服务器端打印以下内容

1 1 2 2 3 3 .. 10 10

1 个答案:

答案 0 :(得分:1)

从您提供的代码中,您似乎没有提供任何同步来更新和读取数字值。这就是你最终看不到20的原因。此代码应位于同步块内。

synchronized (number) {
    dataOutputStream.writeInt(number.getI());
    int i = dataInputStream.readInt();
    number.setI(i);`
}