import java.awt.*;
import java.net.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import javax.swing.Timer; class Server extends Thread {
ServerSocket skt; Socket Client[]=new Socket[10];;
int i = 0; TextArea in; int port,k=0,l=0; //BufferedReader theInputStream; PrintStream theOutputStream; //String readin; Face chat; public Server(int port, Face chat) {
try {
this.port = port;
skt = new ServerSocket(port);
this.chat = chat;
} catch (IOException e) {
chat.ta.append(e.toString());
}
} public void run() { chat.ta.append("等待连线......"); while (true) {
//System.out.print(""+i+"\n");
try {
Client[k] = skt.accept(); /* 接收客户连接 */ //当有客户端连接时就新建一个子线程
if (i < 2) {
ServerThread server[] = new ServerThread[10];
server[k]= new ServerThread(Client[k], this.chat, i);
l=server.length;
server[k].start();
chat.ta.append("客户端" + Client[k].getInetAddress() + "已连线\n");
/*theInputStream = new BufferedReader(new InputStreamReader(Client
.getInputStream()));*/
//for(int j=0;j<server.length;j++)
theOutputStream = new PrintStream(server[k].getClient().getOutputStream());
i = server[k].getI();
k++;
} else {
//theOutputStream = new PrintStream(null);
} } catch (IOException e) {
chat.ta.append(e.toString());
}
finally{
skt.close();
}
} } public void dataout(String data) {
//for(int j=0;j<l;j++)
theOutputStream.println(data);
}
} class ServerThread extends Thread {
//ServerSocket skt; Socket Client; TextArea in; int port; int i; BufferedReader theInputStream; PrintStream theOutputStream; String readin; Face chat; //服务端子线程 public ServerThread(Socket s, Face chat, int i) {
this.i = ++i;
Client = s;
//this.port = port;
//skt = new ServerSocket(port);
this.chat = chat; } public int getI() {
return this.i;
}
public Socket getClient() {
return this.Client;
}
public void run() { //chat.ta.append("等待连线......"); try {
//Client = skt.accept(); /* 接收客户连接 */ //chat.ta.append("客户端" + Client.getInetAddress() + "已连线\n");
theInputStream = new BufferedReader(new InputStreamReader(Client
.getInputStream()));
theOutputStream = new PrintStream(Client.getOutputStream()); while (true) {
readin = theInputStream.readLine();
chat.ta.append(readin + "\n");
} } catch (SocketException e) {
chat.ta.append("连线中断!\n"); chat.clientBtn.setEnabled(true);
chat.serverBtn.setEnabled(true);
chat.tfaddress.setEnabled(true);
chat.tfport.setEnabled(true);
try {
i--;
Client.close();
} catch (IOException err) {
chat.ta.append(err.toString());
}
} catch (IOException e) {
chat.ta.append(e.toString());
}
} public void dataout(String data) {
theOutputStream.println(data);
}
} //Client.java
class Client extends Thread {
Socket skt;
InetAddress host;
int port; BufferedReader theInputStream;
PrintStream theOutputStream;
String readin; Face chat; public Client(String ip, int p, Face chat) {
try {
host = InetAddress.getByName(ip);
port = p;
this.chat = chat;
} catch (IOException e) {
chat.ta.append(e.toString());
}
} public void run() {
try {
chat.ta.append("尝试连线......"); skt = new Socket(host, port);
chat.ta.append("连线成功\n"); theInputStream = new BufferedReader(new InputStreamReader(skt
.getInputStream())); theOutputStream = new PrintStream(skt.getOutputStream());
//Timer myTimer = new Timer();
while (true) {
readin = theInputStream.readLine();
chat.ta.append(readin + "\n");
}
} catch (SocketException e) {
chat.ta.append("连线中断!\n");
chat.clientBtn.setEnabled(true);
chat.serverBtn.setEnabled(true);
chat.tfaddress.setEnabled(true);
chat.tfport.setEnabled(true);
try {
skt.close();
} catch (IOException err) {
chat.ta.append(err.toString());
}
} catch (IOException e) {
chat.ta.append(e.toString());
}
} public void dataout(String data) {
theOutputStream.println(data);
}
}//软件界面,进行按键监听调用。 //face.java class Face extends Frame {
/**
*
*/
private static final long serialVersionUID = 1L;
Button clientBtn, serverBtn;
TextArea ta;
TextField tfaddress, tfport, tftype;
int port;
Client client;
Server server;
boolean iamserver;
static Face frm; public Face() {
clientBtn = new Button("客户端");
serverBtn = new Button("服务器");
ta = new TextArea("", 10, 50, TextArea.SCROLLBARS_BOTH);
tfaddress = new TextField("192.168.1.104", 20);
tfport = new TextField("2000");
tftype = new TextField(50); tftype.addKeyListener(new TFListener());
ta.setEditable(false); setLayout(new FlowLayout());
add(tfaddress);
add(tfport);
add(clientBtn);
add(serverBtn);
add(ta);
add(tftype);
setSize(400, 300);
setTitle("我的聊天室");
this.setVisible(true); clientBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { port = Integer.parseInt(tfport.getText()); client = new Client(tfaddress.getText(), port, frm); client.start(); tfaddress.setEnabled(false);
tfport.setEnabled(false);
serverBtn.setEnabled(false);
clientBtn.setEnabled(false);
}
}); serverBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { port = Integer.parseInt(tfport.getText()); server = new Server(port, frm); server.start(); iamserver = true;
tfaddress.setText("成为服务器"); tfaddress.setEnabled(false);
tfport.setEnabled(false);
serverBtn.setEnabled(false);
clientBtn.setEnabled(false);
}
}); addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}); } public static void main(String args[]) {
frm = new Face();
} private class TFListener implements KeyListener {
public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER) { ta.append(">" + tftype.getText() + "\n"); if (iamserver)
server.dataout(tftype.getText());
else
client.dataout(tftype.getText()); tftype.setText("");
}
} public void keyTyped(KeyEvent e) {
} public void keyReleased(KeyEvent e) {
}
}
}我写的这个程序在客户断开连接之后,服务器也断开了连接,现在的问题是断开连接的服务器怎么不能在作为服务器了。我已经关闭了serversock连接了啊!!!
大家帮我看看。一个作为服务器,一个做客户端,客户端断开连接,服务器端不能再作为服务器。
import java.net.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import javax.swing.Timer; class Server extends Thread {
ServerSocket skt; Socket Client[]=new Socket[10];;
int i = 0; TextArea in; int port,k=0,l=0; //BufferedReader theInputStream; PrintStream theOutputStream; //String readin; Face chat; public Server(int port, Face chat) {
try {
this.port = port;
skt = new ServerSocket(port);
this.chat = chat;
} catch (IOException e) {
chat.ta.append(e.toString());
}
} public void run() { chat.ta.append("等待连线......"); while (true) {
//System.out.print(""+i+"\n");
try {
Client[k] = skt.accept(); /* 接收客户连接 */ //当有客户端连接时就新建一个子线程
if (i < 2) {
ServerThread server[] = new ServerThread[10];
server[k]= new ServerThread(Client[k], this.chat, i);
l=server.length;
server[k].start();
chat.ta.append("客户端" + Client[k].getInetAddress() + "已连线\n");
/*theInputStream = new BufferedReader(new InputStreamReader(Client
.getInputStream()));*/
//for(int j=0;j<server.length;j++)
theOutputStream = new PrintStream(server[k].getClient().getOutputStream());
i = server[k].getI();
k++;
} else {
//theOutputStream = new PrintStream(null);
} } catch (IOException e) {
chat.ta.append(e.toString());
}
finally{
skt.close();
}
} } public void dataout(String data) {
//for(int j=0;j<l;j++)
theOutputStream.println(data);
}
} class ServerThread extends Thread {
//ServerSocket skt; Socket Client; TextArea in; int port; int i; BufferedReader theInputStream; PrintStream theOutputStream; String readin; Face chat; //服务端子线程 public ServerThread(Socket s, Face chat, int i) {
this.i = ++i;
Client = s;
//this.port = port;
//skt = new ServerSocket(port);
this.chat = chat; } public int getI() {
return this.i;
}
public Socket getClient() {
return this.Client;
}
public void run() { //chat.ta.append("等待连线......"); try {
//Client = skt.accept(); /* 接收客户连接 */ //chat.ta.append("客户端" + Client.getInetAddress() + "已连线\n");
theInputStream = new BufferedReader(new InputStreamReader(Client
.getInputStream()));
theOutputStream = new PrintStream(Client.getOutputStream()); while (true) {
readin = theInputStream.readLine();
chat.ta.append(readin + "\n");
} } catch (SocketException e) {
chat.ta.append("连线中断!\n"); chat.clientBtn.setEnabled(true);
chat.serverBtn.setEnabled(true);
chat.tfaddress.setEnabled(true);
chat.tfport.setEnabled(true);
try {
i--;
Client.close();
} catch (IOException err) {
chat.ta.append(err.toString());
}
} catch (IOException e) {
chat.ta.append(e.toString());
}
} public void dataout(String data) {
theOutputStream.println(data);
}
} //Client.java
class Client extends Thread {
Socket skt;
InetAddress host;
int port; BufferedReader theInputStream;
PrintStream theOutputStream;
String readin; Face chat; public Client(String ip, int p, Face chat) {
try {
host = InetAddress.getByName(ip);
port = p;
this.chat = chat;
} catch (IOException e) {
chat.ta.append(e.toString());
}
} public void run() {
try {
chat.ta.append("尝试连线......"); skt = new Socket(host, port);
chat.ta.append("连线成功\n"); theInputStream = new BufferedReader(new InputStreamReader(skt
.getInputStream())); theOutputStream = new PrintStream(skt.getOutputStream());
//Timer myTimer = new Timer();
while (true) {
readin = theInputStream.readLine();
chat.ta.append(readin + "\n");
}
} catch (SocketException e) {
chat.ta.append("连线中断!\n");
chat.clientBtn.setEnabled(true);
chat.serverBtn.setEnabled(true);
chat.tfaddress.setEnabled(true);
chat.tfport.setEnabled(true);
try {
skt.close();
} catch (IOException err) {
chat.ta.append(err.toString());
}
} catch (IOException e) {
chat.ta.append(e.toString());
}
} public void dataout(String data) {
theOutputStream.println(data);
}
}//软件界面,进行按键监听调用。 //face.java class Face extends Frame {
/**
*
*/
private static final long serialVersionUID = 1L;
Button clientBtn, serverBtn;
TextArea ta;
TextField tfaddress, tfport, tftype;
int port;
Client client;
Server server;
boolean iamserver;
static Face frm; public Face() {
clientBtn = new Button("客户端");
serverBtn = new Button("服务器");
ta = new TextArea("", 10, 50, TextArea.SCROLLBARS_BOTH);
tfaddress = new TextField("192.168.1.104", 20);
tfport = new TextField("2000");
tftype = new TextField(50); tftype.addKeyListener(new TFListener());
ta.setEditable(false); setLayout(new FlowLayout());
add(tfaddress);
add(tfport);
add(clientBtn);
add(serverBtn);
add(ta);
add(tftype);
setSize(400, 300);
setTitle("我的聊天室");
this.setVisible(true); clientBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { port = Integer.parseInt(tfport.getText()); client = new Client(tfaddress.getText(), port, frm); client.start(); tfaddress.setEnabled(false);
tfport.setEnabled(false);
serverBtn.setEnabled(false);
clientBtn.setEnabled(false);
}
}); serverBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { port = Integer.parseInt(tfport.getText()); server = new Server(port, frm); server.start(); iamserver = true;
tfaddress.setText("成为服务器"); tfaddress.setEnabled(false);
tfport.setEnabled(false);
serverBtn.setEnabled(false);
clientBtn.setEnabled(false);
}
}); addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}); } public static void main(String args[]) {
frm = new Face();
} private class TFListener implements KeyListener {
public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER) { ta.append(">" + tftype.getText() + "\n"); if (iamserver)
server.dataout(tftype.getText());
else
client.dataout(tftype.getText()); tftype.setText("");
}
} public void keyTyped(KeyEvent e) {
} public void keyReleased(KeyEvent e) {
}
}
}我写的这个程序在客户断开连接之后,服务器也断开了连接,现在的问题是断开连接的服务器怎么不能在作为服务器了。我已经关闭了serversock连接了啊!!!
大家帮我看看。一个作为服务器,一个做客户端,客户端断开连接,服务器端不能再作为服务器。
你直接拷到你的编译器里
主要还是这里
(一个作为服务器,一个做客户端,客户端断开连接,服务器端不能再作为服务器。)
我觉得错误就是Serversock占用的端口没有被释放。
但是我已经close了啊。
问题应该不是太复杂的,应该就是些小问题,大家帮我看看吧
import java.awt.*;
import java.net.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import javax.swing.Timer; class Server extends Thread {
ServerSocket skt; Socket Client[]=new Socket[10];;
int i = 0; TextArea in; int port,k=0,l=0; //BufferedReader theInputStream; PrintStream theOutputStream; //String readin; Face chat; public Server(int port, Face chat) {
try {
this.port = port;
skt = new ServerSocket(port);
this.chat = chat;
} catch (IOException e) {
chat.ta.append(e.toString());
}
} public void run() { chat.ta.append("等待连线......"); while (true) {
//System.out.print(""+i+"\n");
try {
Client[k] = skt.accept(); /* 接收客户连接 */ //当有客户端连接时就新建一个子线程
if (i < 2) {
ServerThread server[] = new ServerThread[10];
server[k]= new ServerThread(Client[k], this.chat, i);
l=server.length;
server[k].start();
chat.ta.append("客户端" + Client[k].getInetAddress() + "已连线\n");
/*theInputStream = new BufferedReader(new InputStreamReader(Client
.getInputStream()));*/
//for(int j=0;j <server.length;j++)
theOutputStream = new PrintStream(server[k].getClient().getOutputStream());
i = server[k].getI();
k++;
} else {
//theOutputStream = new PrintStream(null);
} } catch (IOException e) {
chat.ta.append(e.toString());
}
finally{
skt.close();
}
} } public void dataout(String data) {
//for(int j=0;j <l;j++)
theOutputStream.println(data);
}
} class ServerThread extends Thread {
//ServerSocket skt; Socket Client; TextArea in; int port; int i; BufferedReader theInputStream; PrintStream theOutputStream; String readin; Face chat; //服务端子线程 public ServerThread(Socket s, Face chat, int i) {
this.i = ++i;
Client = s;
//this.port = port;
//skt = new ServerSocket(port);
this.chat = chat; } public int getI() {
return this.i;
}
public Socket getClient() {
return this.Client;
}
public void run() { //chat.ta.append("等待连线......"); try {
//Client = skt.accept(); /* 接收客户连接 */ //chat.ta.append("客户端" + Client.getInetAddress() + "已连线\n");
theInputStream = new BufferedReader(new InputStreamReader(Client
.getInputStream()));
theOutputStream = new PrintStream(Client.getOutputStream()); while (true) {
readin = theInputStream.readLine();
chat.ta.append(readin + "\n");
} } catch (SocketException e) {
chat.ta.append("连线中断!\n"); chat.clientBtn.setEnabled(true);
chat.serverBtn.setEnabled(true);
chat.tfaddress.setEnabled(true);
chat.tfport.setEnabled(true);
try {
i--;
Client.close();
} catch (IOException err) {
chat.ta.append(err.toString());
}
} catch (IOException e) {
chat.ta.append(e.toString());
}
} public void dataout(String data) {
theOutputStream.println(data);
}
} //Client.java
class Client extends Thread {
Socket skt;
InetAddress host;
int port; BufferedReader theInputStream;
PrintStream theOutputStream;
String readin; Face chat; public Client(String ip, int p, Face chat) {
try {
host = InetAddress.getByName(ip);
port = p;
this.chat = chat;
} catch (IOException e) {
chat.ta.append(e.toString());
}
} public void run() {
try {
chat.ta.append("尝试连线......"); skt = new Socket(host, port);
chat.ta.append("连线成功\n"); theInputStream = new BufferedReader(new InputStreamReader(skt
.getInputStream())); theOutputStream = new PrintStream(skt.getOutputStream());
//Timer myTimer = new Timer();
while (true) {
readin = theInputStream.readLine();
chat.ta.append(readin + "\n");
}
} catch (SocketException e) {
chat.ta.append("连线中断!\n");
chat.clientBtn.setEnabled(true);
chat.serverBtn.setEnabled(true);
chat.tfaddress.setEnabled(true);
chat.tfport.setEnabled(true);
try {
skt.close();
} catch (IOException err) {
chat.ta.append(err.toString());
}
} catch (IOException e) {
chat.ta.append(e.toString());
}
} public void dataout(String data) {
theOutputStream.println(data);
}
}//软件界面,进行按键监听调用。 //face.java class Face extends Frame {
/**
*
*/
private static final long serialVersionUID = 1L;
Button clientBtn, serverBtn;
TextArea ta;
TextField tfaddress, tfport, tftype;
int port;
Client client;
Server server;
boolean iamserver;
static Face frm; public Face() {
clientBtn = new Button("客户端");
serverBtn = new Button("服务器");
ta = new TextArea("", 10, 50, TextArea.SCROLLBARS_BOTH);
tfaddress = new TextField("192.168.1.104", 20);
tfport = new TextField("2000");
tftype = new TextField(50); tftype.addKeyListener(new TFListener());
ta.setEditable(false); setLayout(new FlowLayout());
add(tfaddress);
add(tfport);
add(clientBtn);
add(serverBtn);
add(ta);
add(tftype);
setSize(400, 300);
setTitle("我的聊天室");
this.setVisible(true); clientBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { port = Integer.parseInt(tfport.getText()); client = new Client(tfaddress.getText(), port, frm); client.start(); tfaddress.setEnabled(false);
tfport.setEnabled(false);
serverBtn.setEnabled(false);
clientBtn.setEnabled(false);
}
}); serverBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { port = Integer.parseInt(tfport.getText()); server = new Server(port, frm); server.start(); iamserver = true;
tfaddress.setText("成为服务器"); tfaddress.setEnabled(false);
tfport.setEnabled(false);
serverBtn.setEnabled(false);
clientBtn.setEnabled(false);
}
}); addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}); } public static void main(String args[]) {
frm = new Face();
} private class TFListener implements KeyListener {
public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER) { ta.append(">" + tftype.getText() + "\n"); if (iamserver)
server.dataout(tftype.getText());
else
client.dataout(tftype.getText()); tftype.setText("");
}
} public void keyTyped(KeyEvent e) {
} public void keyReleased(KeyEvent e) {
}
}
}我写的这个程序在客户断开连接之后,服务器也断开了连接,现在的问题是断开连接的服务器怎么不能在作为服务器了。我已经关闭了serversock连接了啊!!!
大家帮我看看。一个作为服务器,一个做客户端,客户端断开连接,服务器端不能再作为服务器。
贴代码,记得格式化。方便别人看。
这个我没做过多的异常处理,也没写Swing的界面,你自己修改一下应该可以用了,我看了一下你的服务端实在看不下去了,我不知道你要那么多数组做什么用的。。package demo;import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.LinkedList;
import java.util.List;public class Server {
private ServerSocket ss = null; private List<Socket> list = new LinkedList<Socket>(); private class ReceiveThread extends Thread {
private Socket socket = null; public ReceiveThread(Socket socket) {
super("ReceiveThread");
this.socket = socket;
} @Override
public void run() {
InputStream in = null;
DataInputStream dis = null;
while (true) {
try {
sleep(50);
} catch (InterruptedException e1) {
e1.printStackTrace();
} if (socket == null || socket.isClosed()
|| !socket.isConnected()) {
continue;
}
try {
in = socket.getInputStream();
dis = new DataInputStream(in);
String readUTF = dis.readUTF();
System.out.println("receive client message :" + socket
+ " " + readUTF);
send(readUTF);
} catch (IOException e) {
try {
in.close();
dis.close();
} catch (IOException e1) {
e1.printStackTrace();
}
list.remove(socket);
e.printStackTrace();
}
} }
} public void send(String msg) throws IOException {
for (int i = 0; i < list.size(); i++) {
Socket groupSocket = list.get(i);
OutputStream out = groupSocket.getOutputStream();
DataOutputStream dout = new DataOutputStream(out);
dout.writeUTF(msg);
dout.flush();
out.flush();
}
} public class AcceptSocketThread extends Thread {
public AcceptSocketThread() {
super("AcceptSocketThread");
} public void run() {
try {
ss = new ServerSocket(7788); while (true) {
Socket socket = ss.accept();
list.add(socket);
new ReceiveThread(socket).start();
}
} catch (IOException e) {
e.printStackTrace();
} }
} private void start() throws IOException {
new AcceptSocketThread().start();
} public static void main(String[] args) throws Exception {
System.out.println("Server start ....");
new Server().start();
}}
客户端
package demo;import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;public class Client {
private Socket socket = null; private class ReceiveThread extends Thread {
@Override
public void run() {
while (true) {
try {
InputStream in = socket.getInputStream();
DataInputStream din = new DataInputStream(in);
String readUTF = din.readUTF();
System.out.println("Server Send Message: " + readUTF); } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
} public void start() throws IOException {
socket = new Socket(InetAddress.getByName("127.0.0.1"), 7788); new ReceiveThread().start();
System.out.println("Client start ....\nPlease input message : ");
while (true) {
Scanner scaner = new Scanner(System.in);
String next = scaner.next();
OutputStream out = socket.getOutputStream();
DataOutputStream dout = new DataOutputStream(out);
dout.writeUTF(next);
// scaner.close();
dout.flush();
}
} public static void main(String[] args) throws IOException {
System.out.println("client ...");
Client client = new Client();
client.start();
}}