【发布时间】:2014-06-28 16:04:15
【问题描述】:
所以这是我的代码:
public class TestClass {
public static void main(String[] args) throws IOException, InterruptedException {
Thread server = new Thread(new MyServer());
server.start();
Thread.sleep(750);
Thread client = new Thread(new MyClient());
client.start();
}
}
服务器:
public class MyServer implements Runnable{
public static synchronized void go() throws IOException {
System.out.println("MyServer: Go called...");
ServerSocket serverSocket = new ServerSocket(5000);
while(true){
Socket socket = serverSocket.accept();
System.out.println(time() + "MyServer: Connection accepted!");
OutputStream outputStream = socket.getOutputStream();
System.out.println(time() + "MyServer: socket.getOutputStream");
PrintWriter printWriter = new PrintWriter(outputStream);
System.out.println(time() + "MyServer: New PrintWriter object created!");
printWriter.write("Hello from my socket!");
System.out.println(time() + "MyServer: printwriter.write method called..");
printWriter.flush();
System.out.println(time() + "MyServer: Flushed!");
printWriter.close();
System.out.println(time() + "MyServer: printWriter closed...");
}
}
public static String time(){
return String.valueOf(MyCounterClass.getCounter()) + " ";
}
@Override
public void run() {
try {
go();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户:
public class MyClient implements Runnable {
public static synchronized void go() throws IOException {
Socket socket = new Socket("localhost",5000);
System.out.println(time() + "My Client: Connection established...");
InputStream inputStream = socket.getInputStream();
System.out.println(time() + "MyClient: socket.getInputStream...");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
System.out.println(time() + "MyClient: BufferedReader object created...");
System.out.println(time() + "Bufferedreader readline being called and directly printer: " + bufferedReader.readLine());
System.out.println(time() + "bufferedReader.readline has just been called...");
}
public static String time(){
return String.valueOf(MyCounterClass.getCounter()) + " ";
}
@Override
public void run() {
try {
go();
} catch (IOException e) {
e.printStackTrace();
}
}
}
还有 Counter 类:
public class MyCounterClass {
private static volatile int counter = 0;
synchronized public static int getCounter(){
return counter++;
}
}
输出将是:
0 My Client: Connection established...
1 MyServer: Connection accepted!
2 MyClient: socket.getInputStream...
3 MyClient: BufferedReader object created...
4 MyServer: socket.getOutputStream
6 MyServer: New PrintWriter object created!
7 MyServer: printwriter.write method called..
8 MyServer: Flushed!
9 MyServer: printWriter closed...
5 Bufferedreader readline being called and directly printer: Hello from my socket!
10 bufferedReader.readline has just been called...
订购时:
0 My Client: Connection established...
1 MyServer: Connection accepted!
2 MyClient: socket.getInputStream...
3 MyClient: BufferedReader object created...
4 MyServer: socket.getOutputStream
5 Bufferedreader readline being called and directly printer: Hello from my socket!
6 MyServer: New PrintWriter object created!
7 MyServer: printwriter.write method called..
8 MyServer: Flushed!
9 MyServer: printWriter closed...
10 bufferedReader.readline has just been called...
所以我觉得奇怪的是第 5 行在 6,7,8 之前...这怎么可能?
【问题讨论】:
-
"Flush" 表示保证数据已经传输,否则方法会一直等待。它可以更快地传输。
-
@alk 不是重复的。
标签: java multithreading sockets synchronization