首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

初学者 求解决java的tcp有关问题

2012-04-08 
菜鸟 求解决java的tcp问题SERVER端代码:package Serverimport java.awt.BorderLayoutimport java.awt.ev

菜鸟 求解决java的tcp问题
SERVER端代码:

package Server;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;


public class Server {
public static void main(String[] args) {
ChatServerFrame f = new ChatServerFrame();
}

}

class ChatServerFrame extends JFrame{
ChatServerPanel serverPanel ;
public ChatServerFrame(){
serverPanel = new ChatServerPanel();
this.add(serverPanel);
this.setTitle("///的C/S server端");
this.setSize(500,500);
this.setVisible(true);
}

}

class ChatServerPanel extends JPanel{
ArrayList clientsList =new ArrayList();
ServerSocket server;
JTextArea textarea ;
JButton start ;
JButton quit;
JPanel buttonpanel ;
public ChatServerPanel(){
buttonpanel = new JPanel();
this.setLayout(new BorderLayout());textarea = new JTextArea(300,300);
quit=new JButton("退出");
start = new JButton("启动");
buttonpanel.add(quit);buttonpanel.add(start);



quit.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
System.exit(0);
}

});
start.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
try {
startServer();
} catch (IOException e1) {
e1.printStackTrace();
}
}

});
this.add(textarea,BorderLayout.CENTER);
this.add(buttonpanel,BorderLayout.NORTH);
}
public void setText(String text){
textarea.append(text+"\r\n");}


//这个方法是用来启动服务器,按钮start(启动)就会调用这个方法
public void startServer() throws IOException{
if(server!=null){
setText(" 服务器已经启动于端口9999,不需要再次启动");
return ;
}
server = new ServerSocket(9999);

Thread s = new ServerAcceptThread(server,this);
s.start();//启动监听客户连接的线程
setText("服务器已经成功启动,使用端口9999");}

}
/**
 * 线程1:监听客户端的线程,当有客户端来连接时,把接收到的Socket对象放到列表中
 * */

class ServerAcceptThread extends Thread{
ChatServerPanel p ;
ServerSocket server ;
int num=1;
Date d = new Date();
ServerAcceptThread(ServerSocket server,ChatServerPanel p){
this.server = server;
this.p = p;
}
public void run(){
while(true){
try {
Socket socket =server.accept();
Thread receiveThread=new ReceiveWordThread(socket,p);
receiveThread.start();
//p.clientsList.add(socket);
String ip = socket.getInetAddress().toString();
int port=socket.getPort();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd kk:mm:ss ");
String date=sdf.format(d);
p.setText("客户端"+num+++"连接上:"+"ip地址是:"+ip+"端口号是:"+port+"连接时间是:"+date);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

/**
 * 
 * 线程2:负责接收客户端发过来的内容
 * 有两个作用:1:当有客户端连接时,启动该线程2:通过soket得到InputStream * */
class ReceiveWordThread extends Thread{
Socket s;
ChatServerPanel p;
Date d = new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd kk:mm:ss ");
String date=sdf.format(d);

public ReceiveWordThread(Socket s,ChatServerPanel p) throws IOException{


this.s=s;
this.p=p;
}
public void run(){
try{
InputStream is = s.getInputStream();
OutputStream os = s.getOutputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
PrintWriter out = new PrintWriter(os);
while(true){
out.println(date);
String strWord = br.readLine();
try {
Thread.sleep(60000);
} catch (InterruptedException e) {
e.printStackTrace();
if(strWord.equals("quit")){
p.setText("客户端正常关闭!");
break;
}
}
}
br.close();
out.flush();
out.close();
s.close();

}catch(Exception e){
e.printStackTrace();
}
}
}




CLIENT端代码:

package Client;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;





public class Client {
public static void main(String[] args) {
ChatClientFrame f = new ChatClientFrame();
}

}

class ChatClientFrame extends JFrame{
ChatClientPanel clientPanel ;
public ChatClientFrame(){
clientPanel = new ChatClientPanel();
this.add(clientPanel);
this.setTitle("///的C/S client端");
this.setSize(500,500);
this.setVisible(true);
}

}

class ChatClientPanel extends JPanel{
Socket socket;
JTextArea textarea ;
JButton start ;
JButton quit;
JPanel buttonpanel ;
public ChatClientPanel(){
buttonpanel = new JPanel();
this.setLayout(new BorderLayout());textarea = new JTextArea(300,300);
quit=new JButton("断开");
start = new JButton("链接");
buttonpanel.add(quit);
buttonpanel.add(start);

quit.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
try {
quitClient();
} catch (IOException e1) {
e1.printStackTrace();
}

}

});
start.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
try {
startClient();
} catch (IOException e1) {
e1.printStackTrace();
}
}

});
this.add(textarea,BorderLayout.CENTER);
this.add(buttonpanel,BorderLayout.NORTH);
}
public void setText(String text){
textarea.append(text+"\r\n");}






//这个方法是用来启动服务器,按钮start(启动)就会调用这个方法
public void startClient() throws IOException{
ChatClientPanel p=new ChatClientPanel();
if(socket !=null){
setText(" 请不要再次链接服务器!");
return ;
}
Socket socket = new Socket("127.0.0.1",9999);
setText("服务器已链接");
Thread s = new ClientStartThread(socket,p);
s.start();
}
private void quitClient() throws IOException{
Socket socket=new Socket();
if(socket ==null){
setText(" 请先链接服务器!");
return ;
}

}
}
class ClientStartThread extends Thread{
Socket s;
ChatClientPanel p;
public ClientStartThread(Socket s,ChatClientPanel p) throws IOException{
this.s=s;
this.p=p;
}
public void run(){
while(true){
try{
InputStream is = s.getInputStream();
OutputStream os = s.getOutputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));


PrintWriter out = new PrintWriter(s.getOutputStream());  
p.setText(""+br);
br.close();
s.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
}

class ClientQuitThread extends Thread{
Socket s;
ChatClientPanel p;
public ClientQuitThread(Socket s,ChatClientPanel p) throws IOException{
this.s=s;
this.p=p;
}
public void run(){
while(true){
try{
InputStream is = s.getInputStream();
OutputStream os = s.getOutputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
PrintWriter out = new PrintWriter(s.getOutputStream());  
//out.println("quit");
System.exit(0);
br.close();
s.close();
}catch(Exception e){
e.printStackTrace();
}
}
}

}


每次都会报错说是:SOCKET IS CLOSED(报错是在Client端的InputStream is = s.getInputStream();)

我自己感觉应该是参数的问题,但是又不知道怎么改!希望有高手不吝赐教!




[解决办法]
这代码一般人懒得看

热点排行