Socket服务器给客户端发消息

云青山 2016-09-07 05:02:05
今天在学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();
}
}
}
...全文
293 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
NewMoons 2016-09-08
  • 打赏
  • 举报
回复
问题都让楼主自问自答了,看来尔等是干看拿不到分了。
肃穆丶 2016-09-08
  • 打赏
  • 举报
回复
你这是定义在main方法里面了吧,
云青山 2016-09-07
  • 打赏
  • 举报
回复
局部变量,唉,百度了一下,发现上学时候的知识都忘了
家里敷泥呀 2016-09-07
  • 打赏
  • 举报
回复
云青山 2016-09-07
  • 打赏
  • 举报
回复
但是啊现在突然又有疑问了啊。 线程里面我在调用方法的时候有两种方法一种是将发送消息和接收消息的方法定义成static的这样可以直接调用。 还有一种是将本类对象定义为final 的这样可以直接通过类对象点方法名调用。 必须是final。为什么呢?
云青山 2016-09-07
  • 打赏
  • 举报
回复
小伙伴们不要像我一样粗心啊
云青山 2016-09-07
  • 打赏
  • 举报
回复
啊啊。。。找到原因了。 服务器端在getPrintWriter,没有给autoFlush参数,所以没有自动flush。而且没有手动flush,所以没有发送出去。

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧