socket分不够再加怎么做到接收一个客户端一个字符串,服务器端给客户端一个反馈. 主要是为了,让java和flash通过socket通信.

e_zzz 2005-03-08 12:19:56
socket分不够再加怎么做到接收一个客户端一个字符串,服务器端给客户端一个反馈. 主要是为了,让java和flash通过socket通信.
下面是服务器端代码
但是有个问题
客户端给服务器发信息只有在客户端退出的时候,服务器端把所有接收到的数据一股脑显示出来.

在while之前的服务器端给客户端发的信息客户端可以正常收到.
而在while{...}之间的服务器端给客户端发的信息客户端都收不到.
问题出在while(!done){
str = input.readLine(); //接收客户机指令
}上面客户端给服务器端发的信息,只有在客户端退出或者关闭以后服务器才会把所有信息都显示出来.

我要实现的是
客户给服务器端发一个 "你好" 服务器端发给客户端 "你好已经收到,正在处理"
客户给服务器端发一个 "hello" 服务器端发给客户端 "hello已经收到,正在处理"
就这么简单.不用目前的代码,只要能实现,重新写也行.
只要能解决问题,分不够再加
///////////


package test;

import java.io.*;
import java.net.*;

class serverThread
extends Thread {

Socket clientRequest;
BufferedReader input; //输入流
PrintWriter output; //输出流
public serverThread(Socket s) { //serverThread的构造器
this.clientRequest = s;
//接收receiveServer传来的套接字
InputStreamReader reader;
OutputStreamWriter writer;
try { //初始化输入、输出流
reader = new InputStreamReader
(clientRequest.getInputStream());
writer = new OutputStreamWriter
(clientRequest.getOutputStream());
input = new BufferedReader(reader);
output = new PrintWriter(writer, true);
}
catch (IOException e) {
System.out.println(e.getMessage());
}
output.write("Welcome to the server!\0");//这些话客户端可以收到
//客户机连接欢迎词
output.write("Now is:"+new java.util.Date()+""+"Port:" + clientRequest.getLocalPort()+"\0");//这些话客户端可以收到
output.write("What can I do for you?\0");//这些话客户端可以收到
output.flush();
}

public void run() { //线程的执行方法
String command = null; //用户指令
String str = null;
boolean done = false;
output.write("CHECK 1\0");//这些话客户端可以收到
String str2=null;
String str3=null;
str2="中文能显示吗?";
System.out.println("str2"+str2);
try{
str3 = new String(str2.getBytes("UTF-8"),"8859_1");//这里的中文转换很正常
}
catch (IOException e) {
System.out.println(e.getMessage());
}
System.out.println("str3"+str3);
output.write(str3+"\0");
output.flush();
while (!done) {
try {
str = input.readLine(); //接收客户机指令
System.out.println("From Client 1 "+str);
str = new String(str.getBytes(),"UTF-8");//中文转换,这里有问题不能转换.中文依旧是乱码.
System.out.println("From Client >>> "+str);
output.write("CHECK 2\0");//这里客户端根本接收不到.
output.flush();
if (str==null){
command+="";
System.out.println("P 1");
}
else{
command+=str;
str=null;
System.out.println("P 2");
}
}
catch (IOException e) {
System.out.println(e.getMessage());
}
System.out.println("str"+str);//比如我从客户端发送hello,又发送了abc.客户端退出的时候在同一行一起显示出来hello口abc口,而不是在客户发送后马上显示.
//注:hello口abc口这个"口"字,并不是全角汉字的是一个类似半角的小口字,有人说是/r/n,但我还不敢确定.
System.out.println("command"+command);
if (command == null){
command="";
}
if (str == null || command.equals("QUIT")){
done = true;
}
else if (command.equals("HELP")) {
//命令help查询本服务器可接受的命令
output.write("query\0");
output.write("quit\0");
output.write("help\0");
output.flush();
System.out.println("输出客户端");
}
else if (command.startsWith("QUERY")) { //命令query
output.println("OK to query something!\0");
output.flush();
}
else if (!command.startsWith("HELP") &&
!command.startsWith("QUIT") &&
!command.startsWith("QUERY")) {
output.write("Command not Found! Please refer to the HELP!\0");
output.flush();
}
}
try {
clientRequest.close(); //关闭套接字
}
catch (IOException e) {
System.out.println(e.getMessage());
}
command = null;
}
}
...全文
256 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinxfei 2005-03-08
  • 打赏
  • 举报
回复
这段代码没有问题,
str=input.readLine()
是阻塞函数,当客户端没有信息发送过来的时候,不会向下执行,
而客户端是否发送信息,取决于是否将发送缓冲区清空,
我不太明白flash那里具体怎么处理,但应该有相应的处理。

另外当然还有一种可能性,就是因为readLine是在收到回车换行后才继续,
所以有可能客户端根本没有发送回车换行,
你仔细检查一下。
如果没有就加一个。
e_zzz 2005-03-08
  • 打赏
  • 举报
回复
客户端是flash的
socket握手以后

onxml{}事件来监视服务器传递过来的信息.
请看这个代码片段,来说明一下
//============
while (!done) {
try {
str = input.readLine(); //接收客户机指令
System.out.println("From Client >>> "+str);//在客户端退出以后才执行这句话,客户发过来的所有信息 都在同一行显示出来了.本来我想要的效果是收到一个显示一个.
output.write("CHECK 2\0");//由于客户端退出以后才执行这句话,这里客户端根本接收不到.
output.flush();
System.out.println("这句话只能在客户端退出以后看到");
//============
jinxfei 2005-03-08
  • 打赏
  • 举报
回复
很简单,虽然你没有贴出来客户端的相关代码,
但你必定是在客户端使用了BufferedWriter或者BufferedOutputStream之类的,

你只需要在相关的write代码后紧跟着调用一次flush就可以了。

如果解决不了,给我看看你的客户段代码。
e_zzz 2005-03-08
  • 打赏
  • 举报
回复
欢迎您:e_zzz 可用分:2851 总信誉分:98未结帖数:2 注销我的登录 社区首页

如果能够解决至少给300分
勾玉2004 2005-03-08
  • 打赏
  • 举报
回复
检查一下你的客户端发送的内容编码是哪种格式的哦
e_zzz 2005-03-08
  • 打赏
  • 举报
回复
System.out.println("str"+str);//比如我从客户端发送hello,又发送了abc.客户端退出的时候在同一行一起显示出来hello口abc口,而不是在客户发送后马上显示.
//注:hello口abc口这个"口"字,并不是全角汉字的是一个类似半角的小口字,有人说是/r/n,但我还不敢确定.
e_zzz 2005-03-08
  • 打赏
  • 举报
回复
哦 那么回车用什么表示呢?

81,092

社区成员

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

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