黑马程序员技术交流社区
标题:
JAVA网络编程新手问题
[打印本页]
作者:
Simple_love
时间:
2013-10-22 09:37
标题:
JAVA网络编程新手问题
本帖最后由 Simple_love 于 2013-10-27 22:56 编辑
在网络编程中使用readUTF()等操作输入输出流时容易产生阻塞。比如写一个聊天的程序,只能一边说一句,另一边接收完程序才能往下执行。这要如何解决?有没有聊天程序两边可以任意输入的源代码给个?
public class chatClient extends Frame {
/*** @param args*/
TextField tfTxT=new TextField();
TextArea taContent=new TextArea();
Socket s=null;DataOutputStream dos=null;
DataInputStream dis=null;
private boolean bConnected =false;
public static void main(String[] args) {
new chatClient().lunachFrame();
}
private class RecvThread() implements Runnable{
public void run() {
try{
while(bConnected){
String str=dis.read()UTF();
taContent.setText(taContent.getText()+str+'\n');
}
}catch(IOException e){
e.printStackTrace();
}
}
}
public void lunachFrame(){
this.setLocation(400, 300);
this.setSize(300,300);
//this.setLayout(new FlowLayout());
this.add(tfTxT,"South");
this.add(taContent,"North");
pack();
tfTxT.addActionListener(new TFListener());
this.addWindowListener(new WindowClose());
this.setVisible(true);connect()();
new Thread()(new RecvThread()).start();
}
public void connect()(){
try {s= new Socket("127.0.0.1",8888);
dos =new DataOutputStream(s.getOutputStream());
dis =new DataInputStream(s.getInputStream());
System.out.println("connect()ed!");
bConnected=true;
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void disconnect(){
try {
dos.close();s.close();
} catch (Exception e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
class WindowClose extends WindowAdapter{
@Override
public void windowClosing(WindowEvent e) {
// TODO 自动生成方法存根
System.exit(0);disconnect();
}
}
private class TFListener implements ActionListener{
public void actionPerformed(ActionEvent e) {
String str=tfTxT.getText().trim();
//trim去掉两边空格//
taContent.setText(str);tfTxT.setText("");
try {
dos.writeUTF(str);
dos.flush();
//dos.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
作者:
乔兵
时间:
2013-10-26 14:20
楼主你好,如果问题已解决请将帖子状态修改为提问结束,
如果未解决请继续提问,谢谢合作
修改方法请看解释帖:
http://bbs.itheima.com/thread-89313-1-1.html
作者:
麦子
时间:
2013-10-26 14:50
哥么你这问题要说清楚需要一点时间,大方向我可以告诉你,用多线程
可以采用经典的c/s模式,一个服务器为多个客户端服务,当一个客户端请求服务时,便开启一个新的线程为之服务
你说的明显是采用顺序结构写的代码,一边发完了消息,后面的代码中有阻塞时方法,非要等到接收到对方发来的消息,你才能再次发消息
我写了个简易的程序,先解决你得疑惑
服务端代码
import java.net.*;
import java.io.*;
public class Server1 implements Runnable
{
ServerSocket server = null;
Socket clientSocket;
boolean flag = true; //标记是否结束
Thread c; //向客户器端发送信息的线程
BufferedReader sin;
DataOutputStream sout;
public static void main(String args[])
{
new Server1().ServerStart();
}
public void ServerStart()
{
try
{
server = new ServerSocket(5678);
System.out.println("端口号:"+server.getLocalPort());
while(flag)
{
clientSocket = server.accept();
System.out.println("已建立连接!");
InputStream is = clientSocket.getInputStream();
sin = new BufferedReader(new InputStreamReader(is));
OutputStream os = clientSocket.getOutputStream();
sout = new DataOutputStream(os);
c = new Thread(this);
c.start(); //启动线程,向客户器端发送信息
String aline;
while((aline=sin.readLine())!=null)
{ //接收客户端的数据
System.out.println(aline);
if(aline.equals("bye"))
{
flag = false;
c.interrupt(); //线程中断
break;
}
}
sout.close(); //关闭流
os.close();
sin.close();
is.close();
//clientSocket.close(); //关闭Socket连接
System.exit(0); //程序运行结束
}
}
catch(Exception e)
{
System.out.println(e);
}
}
public void run()
{
while(true)
{
try
{
int ch;
while((ch=System.in.read())!=-1)
{ //从键盘接收字符并向客户端发送
sout.write((byte)ch);
if(ch=='\n')
sout.flush(); //将缓冲区内容向输出流发送
}
}
catch(Exception e)
{
System.out.println(e);
}
}
}
public void finalize() //析构方法
{
try
{
server.close(); //停止ServerSocket服务
}
catch(IOException e)
{
System.out.println(e);
}
}
}
复制代码
客户端代码
import java.net.*;
import java.io.*;
public class Client1 implements Runnable
{
Socket clientSocket;
boolean flag=true; //标记是否结束
Thread c; //用于向服务器端发送信息
BufferedReader cin;
DataOutputStream cout;
public static void main(String arg[])
{
new Client1().ClientStart();
}
public void ClientStart()
{
try
{ //连接服务器端,这里使用本机
clientSocket=new Socket("localhost",5678);
System.out.println("已建立连接!");
while(flag)
{ //获取流对象
InputStream is = clientSocket.getInputStream();
cin=new BufferedReader(new InputStreamReader(is));
OutputStream os = clientSocket.getOutputStream();
cout = new DataOutputStream(os);
c = new Thread(this);
c.start(); //启动线程,向服务器端发送信息
String aline;
while((aline=cin.readLine())!=null)
{ //接收服务器端的数据
System.out.println(aline);
if(aline.equals("bye"))
{
flag = false;
c.interrupt();
break;
}
}
cout.close();
os.close();
cin.close();
is.close();
clientSocket.close(); //关闭Socket连接
System.exit(0);
}
}
catch(Exception e)
{
System.out.println(e);
}
}
public void run()
{
while(true)
{
try
{ //从键盘接收字符并向服务器端发送
int ch;
while((ch=System.in.read())!=-1)
{
cout.write((byte)ch);
if(ch=='\n')
cout.flush(); //将缓冲区内容向输出流发送
}
}
catch(Exception e)
{
System.out.println(e);
}
}
}
}
复制代码
怎么运行不需要我教你吧,控制台哦
好好学习,不懂得可以问我
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2