今天在学Socket的时候,参考着弄了客户端服务器之间的通信,现在是客户端发送给服务器的消息服务器都能收到。
但是服务器给客户端发消息的话不知道是没法出去还是说接收问题。请帮忙看看,谢谢!------------------------------------------------------------------------------------代码:
服务器:package MySocket;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;public class Server { public static void main(String[] args) throws IOException {
ServerSocket serverSocket=new ServerSocket(8694);
Server server=new Server();
Socket socket=null;
try {
socket=serverSocket.accept();
} catch (Exception e) {
e.printStackTrace();
}
final BufferedReader sin=server.getBufferedReader();
final BufferedReader is=server.getSocketBufferedReader(socket);
final PrintWriter os=server.getPrintWriter(socket);

Thread t1=new Thread(){
public void run(){
try {
printMsg(is);
} catch (IOException e) {
e.printStackTrace();
}
}
};
Thread t2=new Thread(){
public void run(){
try {
sendMsh(sin,os);
} catch (IOException e) {
e.printStackTrace();
}
}
};

t1.start();
t2.start();

}

private BufferedReader getBufferedReader(){
return new BufferedReader(new InputStreamReader(System.in));
}

private BufferedReader getSocketBufferedReader(Socket socket) throws IOException{
return new BufferedReader(new InputStreamReader(socket.getInputStream()));
}

private PrintWriter getPrintWriter(Socket socket) throws IOException{
return new PrintWriter(socket.getOutputStream());
}

private static void printMsg(BufferedReader reader) throws IOException{
System.out.println("服务器开始接收消息");
String msg;
msg=reader.readLine();
while(msg!=""&&msg!=null){
System.out.println("客户端说:"+msg);
msg=reader.readLine();
}
}

private static void sendMsh(BufferedReader reader,PrintWriter out) throws IOException{
System.out.println("服务器开始准备发送消息");
String msg;
msg=reader.readLine();
System.out.println("将要发送的消息是:"+msg);
while(msg!=""&&msg!=null){
System.out.println("server:"+msg);
out.println(msg);
msg=reader.readLine();
}
}
}-----------客户端:package MySocket;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;public class Client { public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket=new Socket("127.0.0.1",8694);
Client client=new Client();
final BufferedReader in=client.getBufferedReader();
final BufferedReader socketin=client.getSocketBufferedReader(socket);
final PrintWriter out=client.getPrintWriter(socket);

Thread thread1=new Thread(){
public void run(){
try {
printMsg(socketin);
} catch (IOException e) {
e.printStackTrace();
}
}
};
Thread thread2=new Thread(){
public void run(){
try {
sendMsh(in,out);
} catch (IOException e) {
e.printStackTrace();
}
}
};

thread1.start();
thread2.start();
}

private BufferedReader getBufferedReader(){
return new BufferedReader(new InputStreamReader(System.in));
}

private BufferedReader getSocketBufferedReader(Socket socket) throws IOException{
return new BufferedReader(new InputStreamReader(socket.getInputStream()));
}

private PrintWriter getPrintWriter(Socket socket) throws IOException{
return new PrintWriter(socket.getOutputStream(),true);
}

private static void printMsg(BufferedReader reader) throws IOException{
System.out.println("客户端开始接收消息");
String msg;
msg=reader.readLine();
while(true){
System.out.println("服务器说:"+msg);
msg=reader.readLine();
}
}

private static void sendMsh(BufferedReader reader,PrintWriter out) throws IOException{
System.out.println("准备发送消息");
String msg;
msg=reader.readLine();
while(msg!=""&&msg!=null){
System.out.println("发送:"+msg);
out.println(msg);
out.flush();
msg=reader.readLine();
}
}
}

解决方案 »

  1.   


    啊啊找到原因了。
    服务器端在getPrintWriter,没有给autoFlush参数,所以没有自动flush。而且没有手动flush,所以没有发送出去。
      

  2.   

    但是啊现在突然又有疑问了啊。
    线程里面我在调用方法的时候有两种方法一种是将发送消息和接收消息的方法定义成static的这样可以直接调用。
    还有一种是将本类对象定义为final 的这样可以直接通过类对象点方法名调用。
    必须是final。为什么呢?
      

  3.   

    你这是定义在main方法里面了吧,