package day23;
import java.io.*;
import java.net.*;
class TcpClient2
{
public static void main(String[] args)throws Exception
{
Socket s = new Socket("192.168.1.102",10004);
OutputStream out = s.getOutputStream();
out.write("服务端,你好".getBytes());
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
System.out.println(new String(buf,0,len));
s.close();
}
}
class TcpServer2
{
public static void main(String[] args) throws Exception
{
ServerSocket ss = new ServerSocket(10004);
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"....connected");
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
System.out.println(new String(buf,0,len));
OutputStream out = s.getOutputStream();
Thread.sleep(10000);
out.write("哥们收到,你也好".getBytes());
s.close();
ss.close();
}
}
//先运行服务端TcpServer2,此时因为accept()而阻塞,再运行客户端TcpClient2,客户端和服务端都使用getInputStream方法,获取了读取流in,为什么客户端没有读取到“服务端,你好”并打印?而服务端却读取到了?代码一模一样啊。菜鸟一枚,请大神指点,谢谢。
服务端的导包你这里是省略了是吧?代码没什么问题,正常运行,结果正常。你可以试试重启一下软件,对代码进行剪切粘贴然后重新运行。
应该是服务端没有读取到“服务端,你好”吧?加入循环等待看看?
给你一段参考的服务器端的代码,你漏了循环,等客户端发过来,你服务器已经不收了。。
聊天界面接收信息代码:
public void run() {
String inmsg;
while (true){ //循环
try{
inmsg = in.readLine(); //从流中输入
System.out.println("inmsg "+inmsg);
jList1.setModel(model1); //model和jList参考网上
String[] userInfo = inmsg.split("&");
if (inmsg.startsWith("new")){ //新人
jTextArea1.append("欢迎 "+userInfo[1]+"\n");
model1.addElement(userInfo[1]+" 〖"+userInfo[2]+"〗");
}
else if( inmsg.startsWith("old")) {
model1.addElement(userInfo[1]+" 〖"+userInfo[2]+"〗"); //更新用户列表
}
//一般消息
if (inmsg.startsWith("withWho")){
String showmsg[] = inmsg.split("&");
System.out.println("接收者的名字:"+showmsg[2]+"我的名字"+name+";\n");
if (showmsg[2].equals(name)){ //如果是发给自己的消息
jTextArea2.append(showmsg[1]+"说: "+showmsg[3]+"\n"); //显示到我的频道
}
else{
jTextArea1.append(showmsg[1]+"说:"+showmsg[3]+"\n");
}
}
}catch (Exception ee){
System.out.println("Error at run()"+ee);
jTextArea2.append("与服务器连接中断,请重新登陆!\n");
// 输出流,输入流设置为 null
in = null;
out = null;
return;
}
}
}
如果你问的是为什么没有在客户端本地显示你对服务器说的话
这一句System.out.println(new String(buf,0,len)); 从len取这句话,len的数据来自in,in的数据来自s。但是你的这句话是写到out的
所以我建议吧InputStream in = s.getInputStream(); 改成类似 InputStream in = out.getInputStream(); 试试看。
不编程好多年。。具体能不能这么用out.getInputStream你自己查方法咯。
在开两个CMD窗同时运行没发行问题,看截图
在close()前 Thread.sleep(20000);
没明天你的疑惑是什么意思?“服务端,你好”这句不是客户端对服务端输出的内容吗?什么叫客户端没有显示“服务端,你好”呢?如果想要客户端也显示这句话,难道不应该再用System.out.println("服务端,你好")在客户端输出吗?
OutputStream out = s.getOutputStream();得到的流并不是输出到客户端控制台的