在本机上模拟网络聊天,用Socket进行网络通信的疑问。求大神帮忙解答。

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();得到的流并不是输出到客户端控制台的