关于用一个socket多次对话的问题

lonwin 2006-10-24 10:56:09
我写了个GUI的服务器端和客户端,服务器继承Thread类,每次new 一个线程出来,问题是每次对话时都时临时建立socket,inputstream,outputstream,这样会不会浪费资源,能不能从头到尾,就用一开始建立的一个socket,inputstream,outputstream,直到关闭程序再调用 close()?

如果行的话,请高手务必给出代码,感激不尽!
...全文
218 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lonwin 2006-10-24
  • 打赏
  • 举报
回复
///////////////////////////这是client gui程序////////////////////////
import java.net.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class socketclient extends JFrame implements ActionListener
{

TextArea sysInfo=new TextArea(" ");
Label lbl_txt=new Label("TEXT:");
TextField txt_text =new TextField(30);
JButton btn_send=new JButton("send");
JScrollPane jp=new JScrollPane(sysInfo);
JPanel p=new JPanel();
boolean isConn=false;
Socket client = null;
InputStream netin=null;
PrintWriter out=null;
public socketclient()
{
setSize(430,320);

btn_send.addActionListener(this);
p.setLayout(new FlowLayout(FlowLayout.LEFT));
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e){
setTitle("正在退出...");

System.exit(0);
}
});
getContentPane().add(p,"North");
getContentPane().add(jp,"Center");
p.add(lbl_txt);
p.add(txt_text);
p.add(btn_send);
show();
connect();
}
public void actionPerformed(ActionEvent e)
{
Object eventsource=e.getSource();
if(eventsource==btn_send)
{
send();
}
}
public static void main(String[] args)
{
new socketclient();

}
public void connect()
{
try{
client = new Socket("localhost",65530);
netin=client.getInputStream();
out=new PrintWriter(client.getOutputStream(),true);
}
catch(Exception e)
{
e.printStackTrace();
}
}
public void send()
{
try
{

out.println(txt_text.getText());
sysInfo.append("\r\n我说:"+txt_text.getText());
byte[] buf=new byte[100];
int len=netin.read(buf);
sysInfo.append("\r\nServer:"+new String(buf,0,len));


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

}
public void closeconn()
{
try{
out.close();
netin.close();
client.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
lonwin 2006-10-24
  • 打赏
  • 举报
回复
//这是server端程序
import java.net.*;
import java.io.*;
import java.util.*;
public class socketserver implements Runnable{
private Socket client=null;
private BufferedReader netin=null;
private PrintWriter out=null;

public socketserver(Socket s){
client=s;
try{
netin=new BufferedReader(new InputStreamReader(client.getInputStream()));
out=new PrintWriter(client.getOutputStream());

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

public static void main(String[] args)
{
System.out.println("socket server is listening....");
ServerSocket server=null;
try
{
server=new ServerSocket(65530);
while(true)
{
Socket user=server.accept();
new Thread(new socketserver(user)).start();
}
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
try
{
server.close();

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

}
public void run()
{

try
{
// System.out.println(Thread.currentThread().getName()+"working....");
while(true)
{
String tmpstr=netin.readLine();
System.out.println(client.getInetAddress()+"@"+client.getPort()+" Says:"+tmpstr);
if(tmpstr.equalsIgnoreCase("bye"))
{
out.close();
netin.close();
client.close();
return;
}
else out.println(tmpstr);

}


}
catch(Exception e)
{
e.printStackTrace();
try{out.close();
netin.close();
client.close();}
catch(Exception ee)
{
}
}


}
}
yanhan0615 2006-10-24
  • 打赏
  • 举报
回复
1.服务器把所有没有断开的连接做保存,使用多线程甚至是线程池;
2.客户端使用线程,在需要的情况下一直保持连接;
3.自定义一些协议和包头,例如关闭连接,发送信息等
英有尽有 2006-10-24
  • 打赏
  • 举报
回复
socket可以一直连着的
zzhzzh204553 2006-10-24
  • 打赏
  • 举报
回复
socket对象可以用一个变量保存啊.
zgysc 2006-10-24
  • 打赏
  • 举报
回复
帮你顶!

62,614

社区成员

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

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