谁能帮我看一下,这个程序该如何改,才能实现我所预斯的功能,谢谢大家!

deng4437 2008-02-18 07:56:50
这个程序,已经可以运行,但是现在只能连接一次.
在客户端,用户单击按钮b的话,就进行套接字和服务器的连接,然后把从服务器传过来的一行数据打在文本区上.
现在我重新定义了一按钮b1,我现在想实现的新功能是,如果按了b1的话,就先断开当前的连接,然后,开始一次新的套接字连接,然后在文本区上,再接着打上一行同样的数据.
但是我把下面的这个程序改了一下,还是没有实现这个功能,只能连接一次,接着,按哪个键都不会再起任何作用.
请大家,帮我改改这个程序,谢谢了!!!!!!


下面这个程序是一个利用套接字,建立两台机之间的测试的程序.

客户端:

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;


class MyClient extends Frame implements Runnable,ActionListener{

TextArea t;
Button b=new Button("连接");
Button b1=new Button("断开");
Socket s=new Socket();
DataInputStream in;
Thread myThread = new Thread(this);
InetSocketAddress address;
boolean isEnd;

public MyClient()
{ b1.addActionListener(this);
b.addActionListener(this);
add(b,"North");
add(b1,"South");
t=new TextArea("这里是一号机\n",10,10,TextArea.SCROLLBARS_BOTH);
add(t,"Center");
setBounds(200,200,400,400);
setVisible(true);
validate();
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);


}

}

);



}


public void actionPerformed(ActionEvent e)
{
if(e.getSource()==b)
{
myThread.start();
}
else if(e.getSource()==b1)
{
isEnd=true;
myThread.start();
}

}






public void run()
{
isEnd=false;

try{
address=new InetSocketAddress(InetAddress.getByName("127.0.0.1"),3400);
s.connect(address,5000);
if(!s.isConnected())
{
t.append("Haven't connected to the Server\n");
}
else
{ t.append("Have connected to the Server\n");
in=new DataInputStream(s.getInputStream());
int l=0;
byte buffer[]=new byte[1024];
while((l=in.read(buffer,0,1024))!=-1)
{
t.append(new String(buffer,0,l)+'\n');
if(isEnd==true)
{
in.close();
return;
}

}

}


}
catch(SocketTimeoutException e1)
{
t.append("Haven't connected to the Server\n");
}
catch(IOException e){}

}
public static void main(String args[])
{
new MyClient();


}

}



服务器端:

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;


class MyServer extends Frame implements Runnable{

TextArea t;
Socket s;
ServerSocket ss;
DataOutputStream out;
Thread myThread;


public MyServer()
{

t=new TextArea("这里是服务器\n",10,10,TextArea.SCROLLBARS_BOTH);
add(t,"Center");
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);


}

}

);
setBounds(200,200,400,400);
setVisible(true);
validate();

try{
ss=new ServerSocket(3400);
s=ss.accept();
if(s!=null)
{
new Thread(this).start();
}
}
catch(IOException e){}

}







public void run()
{
try{
out=new DataOutputStream(s.getOutputStream());
byte buffer[]="程序已经成功!".getBytes();
out.write(buffer,0,buffer.length);
out.close();
}
catch(IOException e){}



}
public static void main(String args[])
{
new MyServer();


}

}

...全文
192 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
deng4437 2008-02-21
  • 打赏
  • 举报
回复
谢谢大家!!!!!!
xiaoyu_air 2008-02-21
  • 打赏
  • 举报
回复
同一线程不能用两次START();

我改了个容易看懂的,
MyServer.java

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;

class MyServer extends Frame implements Runnable {

TextArea t;
Socket s;
ServerSocket ss;
DataOutputStream out;
Thread myThread;

public MyServer() {

t = new TextArea("这里是服务器\n", 10, 10, TextArea.SCROLLBARS_BOTH);
add(t, "Center");
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);

}

}

);
setBounds(200, 200, 400, 400);
setVisible(true);
validate();

connection();

}

public void connection() {
try {
ss = new ServerSocket(3400);
} catch (IOException e1) {
e1.printStackTrace();
}
while(true) {
try {
s = ss.accept();
if (s != null) {
new Thread(this).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

public void run() {
try {
out = new DataOutputStream(s.getOutputStream());
byte buffer[] = "程序已经成功!".getBytes();
out.write(buffer, 0, buffer.length);
out.close();
} catch (IOException e) {
e.printStackTrace();
}

}

public static void main(String args[]) {
new MyServer();

}

}

MyClient.java
[code=Java]
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;

class MyClient extends Frame implements Runnable, ActionListener {

TextArea t;
Button b = new Button("连接");
Button b1 = new Button("断开");
Socket s;
DataInputStream in;
Thread myThread;
InetSocketAddress address;
boolean isEnd;

public MyClient() {
b1.addActionListener(this);
b.addActionListener(this);
add(b, "North");
add(b1, "South");
t = new TextArea("这里是一号机\n", 10, 10, TextArea.SCROLLBARS_BOTH);
add(t, "Center");
setBounds(200, 200, 400, 400);
setVisible(true);
validate();
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);

}

}

);

}

public void actionPerformed(ActionEvent e) {
if (e.getSource() == b) {
myThread = new Thread(this);
myThread.start();
} else if (e.getSource() == b1) {
// isEnd = true;
myThread = null;
try {
s.close();
t.append("连接已断开\n");
} catch (IOException e1) {
e1.printStackTrace();
}
}

}

public void run() {
// isEnd = false;
try {
address = new InetSocketAddress(InetAddress.getByName("127.0.0.1"),
3400);
s = new Socket();
s.connect(address, 5000);
if (!s.isConnected()) {
t.append("Haven't connected to the Server\n");
} else {
t.append("Have connected to the Server\n");
in = new DataInputStream(s.getInputStream());
int l = 0;
byte buffer[] = new byte[1024];
while ((l = in.read(buffer, 0, 1024)) != -1) {
t.append(new String(buffer, 0, l) + '\n');
// if (isEnd == true) {
// in.close();
// return;
// }

}

}

} catch (SocketTimeoutException e1) {
t.append("Haven't connected to the Server\n");
} catch (IOException e) {
}

}

public static void main(String args[]) {
new MyClient();

}

}


[/code]
deng4437 2008-02-19
  • 打赏
  • 举报
回复
的确如此,但是刚才试过了,没用啊,还是不行啊.
wuxo84 2008-02-19
  • 打赏
  • 举报
回复
你说的我今天白天也试了,是不能两次调用start(),
我帮他改的时候,把处理放到一个类里,并实现runable接口,在捕获事件的时候生成新的实例并启动一个线程,但还是不成,t没变,还用的本类里的,但线程启动以后客户端的文本不增加,
不过去是实现了多线程,每新开启一个客户端去与服务器通信都没问题,但同一个客户端两次连接还是没搞定,明天再帮他看看~
wuxo84 2008-02-19
  • 打赏
  • 举报
回复
先把服务器改成多线程的,不是楼上那样,放在run()里,这么写

public void run()
{
try
{
ss = new ServerSocket( 3400 );
while( true )
{
s = ss.accept();
out = new DataOutputStream( s.getOutputStream() );
byte buffer[] = "程序已经成功!".getBytes();
out.write( buffer,0,buffer.length );
out.close();
}
}
catch( IOException e )
{

}
}

public static void main( String[] args )
{
Thread t = new Thread( new MyServer() );
t.start();
}

连接的问题折腾1个来小时了,还是没看出来哪错,我再看看
KK3K2005 2008-02-19
  • 打赏
  • 举报
回复
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==b)
{
myThread.start();
}
else if(e.getSource()==b1)
{
isEnd=true;
myThread.start();
}

}

这里不对,Thread 只能执行 start() 一次 按你的结构 要么每次建立新的THREAD对象{按你现在的写法不行} 要么就别建立线程了 直接调用 this.run()
最好的办法就是把socket功能封装到独立的类里,在这个类里定义接口事件来反馈scoket接受的东东
wdchengxuyuanzm 2008-02-18
  • 打赏
  • 举报
回复
ss=new ServerSocket(3400);
s=ss.accept();
if(s!=null)
{
new Thread(this).start();
}

服务器的这段代码只能监听一次。要实现不断地监听。
改成下面的:
while(true)
{
ss=new ServerSocket(3400);
s=ss.accept();
new Thread(this).start();
}

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧