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 list=new ArrayList();//接收客户端的信息
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) {
}
}
}
我的代码
package com.xinbo;
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.JTextArea;
public class TextServer {
static ServerSocket ss;
static ArrayList list=new ArrayList<>();
static JTextArea jta;
static ExecutorService e;
static class Talk implements Runnable{
String msg;
DataInputStream dis;
DataOutputStream dos;
Socket s;
public Talk(Socket s){
this.s=s;
try {
dis=new DataInputStream(s.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
try {
while((msg=dis.readUTF())!=null){
msg="["+s.getPort()+"]说: "+msg;
jta.append(msg+"\n");
}
for(Socket s:list){
dos=new DataOutputStream(s.getOutputStream());
dos.writeUTF(msg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws IOException {
JFrame jf=new JFrame("服务端");
jta=new JTextArea();
jta.append("服务端已开启\n");
jf.add(jta);
jf.setVisible(true);
jf.setBounds(100, 100, 400, 300);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
e=Executors.newCachedThreadPool();
ss=new ServerSocket(1912);
Socket s=null;
while(true){
s=ss.accept();
list.add(s);
e.execute(new Talk(s));
}
}
}
package com.xinbo;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
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 {
static JTextField jtf=new JTextField(26);;
static JTextArea jta=new JTextArea();;
static DataOutputStream dos;
static DataInputStream dis;
public static void main(String[] args){
JFrame jf=new JFrame("客户端");
JPanel jp=new JPanel();
JButton jb=new JButton("发送");
jp.add(jtf);jp.add(jb);
jf.add(jta,BorderLayout.CENTER);
jf.add(jp,BorderLayout.SOUTH);
jf.setBounds(100, 100, 400, 300);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
String str=jtf.getText().toString();
try {
dos.writeUTF(str);
dos.flush();//清空dos的输出流
} catch (IOException e) {
e.printStackTrace();
}finally {
jtf.setText("");
}
}
});
//jtf.addKeyListener(new KeyListener() {
//@Override
//public void keyTyped(KeyEvent arg0) {
TODO Auto-generated method stub
//
//}
//@Override
//public void keyReleased(KeyEvent arg0) {
TODO Auto-generated method stub
//
//}
//@Override
//public void keyPressed(KeyEvent key) {
TODO Auto-generated method stub
//if(key.getKeyCode()==KeyEvent.VK_ENTER){
//String str=jtf.getText().toString();
//try {
//dos.writeUTF(str);
//dos.flush();//清空dos的输出流
//} catch (IOException e) {
//e.printStackTrace();
//}finally {
//jtf.setText("");
//}
//}
//}
//});
Socket s;
try {
s=new Socket("localhost",1912);
dis=new DataInputStream(s.getInputStream());
dos=new DataOutputStream(s.getOutputStream());
while(true){
String str= dis.readUTF();
System.out.println(123);
if(str!=null){
jta.append(str+"\n");
}
}
} catch (UnknownHostException e) {
} catch (IOException e) {
}
}
}