高手,您好:
小弟遇到的故障如下:
小弟设计了一个全双工通信实验,由两个通信端点C端与S端组成。
运行其中的通信接收端S端,它的源代码如下:
package pack;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextField;public class Server extends JFrame {
Vector<Socket> v = new Vector<Socket>(); // 创建存放客户端连接套接字的集合
int port;// 端口号
JTextField jtf; // 设置为属性 方便写事件的时候使用 public Server() { // 设置服务器默认窗口
this.setTitle("基于TCP协议的服务器中转聊天");
this.setSize(320, 100);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
this.setLocation(d.width / 2 - getWidth() / 2, d.height / 2 - getHeight() / 2);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(null);
setAlwaysOnTop(true); // 文本框 输入端口号
jtf = new JTextField();
jtf.setColumns(10);
jtf.setBounds(10, 10, 80, 30);
jtf.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
char c = e.getKeyChar();
if ('\n' == c) {
String s = jtf.getText();
if (s.matches("[0-9]{4,6}")) {
port = new Integer(s);
setVisible(false); // 该设置要放在服务区启动之前
server();
} else {
jtf.setText("");
JOptionPane.showMessageDialog(null, "请输入4-6位的数字!");
}
}
}
});
this.add(jtf);
// 按钮 启动服务器(事件)
JButton jb = new JButton("启动服务器");
jb.setBounds(180, 10, 100, 30);
jb.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String s = jtf.getText();
if (s.matches("[0-9]{4,6}")) {
port = new Integer(s);
setVisible(false); // 该设置要放在服务区启动之前
server();
} else {
jtf.setText("");
JOptionPane.showMessageDialog(null, "请输入4-6位的数字!");
}
}
});
this.add(jb);
} public void server() {
// 创建服务器,病不停等待客户端连接,并将客户端连接存入集合
try {
ServerSocket s = new ServerSocket(2222);//这里的端口号“9999”是为Server端的本地端口号。
System.out.println("服务器已创建...");
while (true) {
Socket c = s.accept();// 等待客户端响应
System.out.println("客户端+[" + c.getInetAddress() + "]已连接");
v.add(c); // 将连接的客户端套接字放入集合,存放起来
// 启动转发线程
Transmit t = new Transmit(); // new一个线程实例
t.c = c; // 将连接的客户端套接字C传递给线程
t.start();
}
} catch (IOException e) {
System.out.println("服务器启动出错");
e.printStackTrace();
}
} public class Transmit extends Thread { // 实现转发功能的线程
Socket c; public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream()));
while (true) { // 循环读取
String s = br.readLine();
System.out.println("成功!!=========="+s);
for (Socket c : v) { // 转发给其他所有已连接的线程
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(c.getOutputStream()));
bw.write(s + "\n");
bw.flush();
}
}
} catch (IOException e) {
System.out.println(c.getInetAddress() + "已退出");
v.remove(c);// 不执行服务器会出现问题 要经常重启
}
}
} public static void main(String[] args) {
new Server().setVisible(true);
}
}
接着,小弟运行了源代码如下的通信C端的主类TestServerSocket:
package test0;import java.awt.BorderLayout;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;public class TestServerSocket extends JFrame{
// JTextArea jta = new JTextArea();
JTextField jtf = new JTextField();
JTextField jtf0 = new JTextField();
JButton jb = new JButton();
// JButton jb0 = new JButton();
JPanel jp = new JPanel();
String str0;
String str1;
int port;
public TestServerSocket() {
// TODO Auto-generated constructor stub
jp.setBounds(new Rectangle(0,0,400,200));
jp.setLayout(new BorderLayout());
// jp.add(jta,BorderLayout.NORTH);
jp.add(jtf,BorderLayout.NORTH);
jp.add(jtf0,BorderLayout.SOUTH);
jp.add(jb,BorderLayout.EAST);
// jp.add(jb0,BorderLayout.WEST);
this.add(jp);
this.setBounds(new Rectangle(200,100,400,200));
this.setVisible(true);
jb.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
try{
String str1 = jtf.getText();
// jta.setText(str);
String str0 = jtf0.getText();
if(str0!=""){
System.out.println("abc");
}
str1 = jtf.getText();
port = Integer.parseInt(str1);
System.out.println(str0);
System.out.println(port);Socket s = null;
try {
s = new Socket("127.0.0.1",2222);
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
bw.write("Hello_World"+"\n");
WriteStr obj = new WriteStr(s,"Hello_World"+"\n");
obj.start();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}catch(Exception e2){
e2.printStackTrace();
}
}});
this.add(jp);
} public static void main(String[] args) {
// TODO Auto-generated method stub
new TestServerSocket();
}} 上面“TestServerSocket类”中的“WriteStr类”,它的源代码如下:
package test0;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;public class WriteStr extends Thread{
static Socket s = null;
BufferedWriter bw = null;
String str = null;
public WriteStr(Socket s,String str){
this.s = s;
try {
bw = new BufferedWriter(new OutputStreamWriter(this.s.getOutputStream()));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.str=str;
}
public void run(){
try {
bw.write("CJCO"+this.str);
System.out.println("++++Client端write下方++++"+this.str);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} 高手,现在小弟运行完毕S端Server类与C端TestServerSocket类之后,得到的运行结果如下:
小弟点击其中的“JButton按钮”,得到下面S端的监视器console的报告:
“
服务器已创建...
客户端+[/127.0.0.1]已连接
”
于是,小弟定位到“客户端+”关键字所在的小弟实验项目的代码现场,得到代码如下:
高手,小弟自认为,上面的小弟的S端接收用户写数据的readLine()方法代码现场,没有什么没有考虑到的地方。怎么S端的console窗口,就是打印不出来应当接收到的值呢?
希望得到高手的点拨!!
谢谢高手的过目!!
小弟遇到的故障如下:
小弟设计了一个全双工通信实验,由两个通信端点C端与S端组成。
运行其中的通信接收端S端,它的源代码如下:
package pack;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextField;public class Server extends JFrame {
Vector<Socket> v = new Vector<Socket>(); // 创建存放客户端连接套接字的集合
int port;// 端口号
JTextField jtf; // 设置为属性 方便写事件的时候使用 public Server() { // 设置服务器默认窗口
this.setTitle("基于TCP协议的服务器中转聊天");
this.setSize(320, 100);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
this.setLocation(d.width / 2 - getWidth() / 2, d.height / 2 - getHeight() / 2);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(null);
setAlwaysOnTop(true); // 文本框 输入端口号
jtf = new JTextField();
jtf.setColumns(10);
jtf.setBounds(10, 10, 80, 30);
jtf.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
char c = e.getKeyChar();
if ('\n' == c) {
String s = jtf.getText();
if (s.matches("[0-9]{4,6}")) {
port = new Integer(s);
setVisible(false); // 该设置要放在服务区启动之前
server();
} else {
jtf.setText("");
JOptionPane.showMessageDialog(null, "请输入4-6位的数字!");
}
}
}
});
this.add(jtf);
// 按钮 启动服务器(事件)
JButton jb = new JButton("启动服务器");
jb.setBounds(180, 10, 100, 30);
jb.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String s = jtf.getText();
if (s.matches("[0-9]{4,6}")) {
port = new Integer(s);
setVisible(false); // 该设置要放在服务区启动之前
server();
} else {
jtf.setText("");
JOptionPane.showMessageDialog(null, "请输入4-6位的数字!");
}
}
});
this.add(jb);
} public void server() {
// 创建服务器,病不停等待客户端连接,并将客户端连接存入集合
try {
ServerSocket s = new ServerSocket(2222);//这里的端口号“9999”是为Server端的本地端口号。
System.out.println("服务器已创建...");
while (true) {
Socket c = s.accept();// 等待客户端响应
System.out.println("客户端+[" + c.getInetAddress() + "]已连接");
v.add(c); // 将连接的客户端套接字放入集合,存放起来
// 启动转发线程
Transmit t = new Transmit(); // new一个线程实例
t.c = c; // 将连接的客户端套接字C传递给线程
t.start();
}
} catch (IOException e) {
System.out.println("服务器启动出错");
e.printStackTrace();
}
} public class Transmit extends Thread { // 实现转发功能的线程
Socket c; public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream()));
while (true) { // 循环读取
String s = br.readLine();
System.out.println("成功!!=========="+s);
for (Socket c : v) { // 转发给其他所有已连接的线程
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(c.getOutputStream()));
bw.write(s + "\n");
bw.flush();
}
}
} catch (IOException e) {
System.out.println(c.getInetAddress() + "已退出");
v.remove(c);// 不执行服务器会出现问题 要经常重启
}
}
} public static void main(String[] args) {
new Server().setVisible(true);
}
}
接着,小弟运行了源代码如下的通信C端的主类TestServerSocket:
package test0;import java.awt.BorderLayout;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;public class TestServerSocket extends JFrame{
// JTextArea jta = new JTextArea();
JTextField jtf = new JTextField();
JTextField jtf0 = new JTextField();
JButton jb = new JButton();
// JButton jb0 = new JButton();
JPanel jp = new JPanel();
String str0;
String str1;
int port;
public TestServerSocket() {
// TODO Auto-generated constructor stub
jp.setBounds(new Rectangle(0,0,400,200));
jp.setLayout(new BorderLayout());
// jp.add(jta,BorderLayout.NORTH);
jp.add(jtf,BorderLayout.NORTH);
jp.add(jtf0,BorderLayout.SOUTH);
jp.add(jb,BorderLayout.EAST);
// jp.add(jb0,BorderLayout.WEST);
this.add(jp);
this.setBounds(new Rectangle(200,100,400,200));
this.setVisible(true);
jb.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
try{
String str1 = jtf.getText();
// jta.setText(str);
String str0 = jtf0.getText();
if(str0!=""){
System.out.println("abc");
}
str1 = jtf.getText();
port = Integer.parseInt(str1);
System.out.println(str0);
System.out.println(port);Socket s = null;
try {
s = new Socket("127.0.0.1",2222);
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
bw.write("Hello_World"+"\n");
WriteStr obj = new WriteStr(s,"Hello_World"+"\n");
obj.start();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}catch(Exception e2){
e2.printStackTrace();
}
}});
this.add(jp);
} public static void main(String[] args) {
// TODO Auto-generated method stub
new TestServerSocket();
}} 上面“TestServerSocket类”中的“WriteStr类”,它的源代码如下:
package test0;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;public class WriteStr extends Thread{
static Socket s = null;
BufferedWriter bw = null;
String str = null;
public WriteStr(Socket s,String str){
this.s = s;
try {
bw = new BufferedWriter(new OutputStreamWriter(this.s.getOutputStream()));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.str=str;
}
public void run(){
try {
bw.write("CJCO"+this.str);
System.out.println("++++Client端write下方++++"+this.str);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} 高手,现在小弟运行完毕S端Server类与C端TestServerSocket类之后,得到的运行结果如下:
小弟点击其中的“JButton按钮”,得到下面S端的监视器console的报告:
“
服务器已创建...
客户端+[/127.0.0.1]已连接
”
于是,小弟定位到“客户端+”关键字所在的小弟实验项目的代码现场,得到代码如下:
高手,小弟自认为,上面的小弟的S端接收用户写数据的readLine()方法代码现场,没有什么没有考虑到的地方。怎么S端的console窗口,就是打印不出来应当接收到的值呢?
希望得到高手的点拨!!
谢谢高手的过目!!
1.做一下输入输出非空校验,看看有没有获取到
2.通过DEBUG,检查一下swing界面按钮触发事件,是否有把值获取正确
3.最后就是端口问题,检查一下端口有没有被占用