o(≧口≦)o刚才打了很多内容,结果忘了网络断开了,没法自动存稿。结果一发布把内容都弄没了。气死,不写了。
今天讲的是JAVAEE,讲的很快,主要就重点或者是和SE不一样的才过一下,差不多的就跳过去,让我们自己看PPT。。。。。。(没掉的内容)。。。。。。
上周做了个简单的聊天室功能代码,一直出错。发的内容只能在服务端看到,客户端却看不到。字符串一直等待接收,但就是收不到。对着老师的代码改了好几遍,还是不行。还让老师帮忙看了很久,也还是没发现问题。今天下午又试着做了一遍,不过代码不熟,还是按照自己以前的代码写的,老问题。晚上又看着老师的代码学了一遍,总算好了,然后发现了问题在哪里了。
原来是服务端遍历写入内容时没另外用方法,和服务端读取内容在一个try catch语句里面,结果一直没法在那边等着。
这博文,改一下标题,希望如果有同样问题的能看到。原标题:JAVASE_day_024
贴一下老师的代码吧,我的差不多,就不贴了。
所先,得先跑服务端。
package com.xinbo;
import java.awt.BorderLayout;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class TestServer {
private static JTextArea jta=new JTextArea();
private static ServerSocket server;
private static ArrayList<Socket> list=new ArrayList<Socket>();//接收客户端的信息
private static ExecutorService exec;
static class Talk implements Runnable{
private Socket client;
private DataInputStream fromclient;
private DataOutputStream toclient;
String msg;
public Talk(Socket client){
this.client=client;
try {
fromclient=new DataInputStream(client.getInputStream());
} catch (IOException e) {
}
}
@Override
public void run() {
try {
while((msg=fromclient.readUTF())!=null){
msg="["+client.getPort()+"]说:"+msg;
jta.append(msg+"\n");
xiaoMessage();
}
} catch (IOException e) {
}
}
public void xiaoMessage(){
for(Socket client:list){
try {
toclient=new DataOutputStream(client.getOutputStream());
toclient.writeUTF(msg);
} catch (IOException e) {
}
}
}
}
public static void main(String[] args) {
JFrame f=new JFrame("服务端");
f.add(new JScrollPane(jta), BorderLayout.CENTER);
f.setBounds(100, 100, 400, 300);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
try {
server=new ServerSocket(1314);
exec=Executors.newCachedThreadPool();
jta.append("服务器已开启");
Socket client =null;
while(true){
client=server.accept();
list.add(client);
exec.execute(new Talk(client));
}
} catch (IOException e) {
}
}
}
然后就是跑客户端,可以开好几个窗口。
package com.xinbo;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class TestClient {
private static JPanel p=new JPanel();
private static JTextField jtf=new JTextField();
private static JTextArea jta=new JTextArea();
private static DataInputStream fromserver;
private static DataOutputStream toserver;
private static JButton jb=new JButton("发送");
public static void main(String[] args) {
JFrame f=new JFrame("客户端");
p.setLayout(new BorderLayout());
JPanel p2=new JPanel();
p2.setLayout(new BorderLayout());
p2.add(jtf,BorderLayout.CENTER);
p2.add(jb,BorderLayout.EAST);
p.add(p2,BorderLayout.SOUTH);
p.add(jta,BorderLayout.CENTER);
f.add(p);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setBounds(100, 100, 400, 300);
jb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String str=jtf.getText().toString();
try {
toserver.writeUTF(str);
toserver.flush();
} catch (IOException e1) {
}finally{
jtf.setText("");
}
}
});
Socket client;
try {
client=new Socket("localhost",1314);
fromserver=new DataInputStream(client.getInputStream());
toserver=new DataOutputStream(client.getOutputStream());
while(true){
String msg=fromserver.readUTF();
if(msg!=null){
jta.append(msg+"\n");
}
}
} catch (UnknownHostException e1) {
} catch (IOException e1) {
}
}
}
JAVA聊天室客户端不显示内容,服务端没问题的原因总算找到了
原文地址:http://qq445493481.blog.51cto.com/9545543/1585701