读书人

java socket 客户端之间通信有关问题

发布时间: 2012-12-16 12:02:32 作者: rapoo

java socket 客户端之间通信问题。
客户端登陆后,用户成员列表一直为空。以下是服务端与客户端的源代码。望大师能多多指教。补充下,客户端运行后,会抛出异常如下:Exception in thread "Thread-2" java.util.NoSuchElementException
at java.util.StringTokenizer.nextToken(Unknown Source)
at chatFrame.run(Chat.java:199)
at java.lang.Thread.run(Unknown Source)
我是菜鸟,整了半天,也不知道该怎么解决,特来此请教大师。望能高抬贵手,给出解决之法……
服务器端源代码:

import java.io.*;
import java.net.*;
import java.util.*;

public class Server extends ServerSocket
{

static final int SERVER_PORT=10000;

Vector<Object> vector1=new Vector<Object>();
Vector<Object> vector2=new Vector<Object>();

public Server() throws IOException
{
super(SERVER_PORT);

try{

while(true)
{
System.out.println("等待客户连接……");

Socket socket=accept();

new CreateServerThread(socket,vector1,vector2);
}
}
catch(IOException e){System.out.println("客户连接错误");}
finally
{
close();
}
}

public static void main(String[] args) throws IOException
{

new Server();
}
}

class CreateServerThread extends Thread
{
Socket socket;
DataInputStream in;
DataOutputStream out;

Vector<Object> vector1;
Vector<Object> vector2;

public boolean bool=false;
String revStr=null;
String string=null;

int userID;
String str=null;
Enumeration enu;

public CreateServerThread(Socket s,Vector<Object> vec1,Vector<Object> vec2)throws IOException
{

socket=s;
vector1=vec1;
vector2=vec2;
out=new DataOutputStream(socket.getOutputStream());
in=new DataInputStream(socket.getInputStream());

start();
}

public void run()
{
StringTokenizer st;
StringTokenizer stc;


try{
while(true)
{
revStr=in.readUTF();

if(revStr.startsWith("新用户"));
{
if(vector1.contains(revStr))

{ out.writeUTF("该用户名已注册");}
else
{
System.out.println("收到客户的登录信息……"+revStr);
out.writeUTF("可以注册");

str=revStr;

vector1.add(revStr);

Enumeration enu=vector1.elements();
while(enu.hasMoreElements())
{
out.writeUTF((String)enu.nextElement());
}
bool=true;
Enumeration enuc=vector2.elements();

while(enuc.hasMoreElements())
{
CreateServerThread th=(CreateServerThread)enuc.nextElement();
th.out.writeUTF(revStr);
}
stc=new StringTokenizer(revStr,":");
string=stc.nextToken();
string=stc.nextToken();
Enumeration enuc1=vector2.elements();
while(enuc1.hasMoreElements())
{
CreateServerThread th=(CreateServerThread)enuc1.nextElement();
th.out.writeUTF(string+"……上线了");
}
vector2.add(this);
}
}

if (revStr.startsWith("下线了")||socket.isClosed())
{
st=new StringTokenizer(revStr,":");
string=st.nextToken();
string=st.nextToken();
userID=vector1.indexOf(str);
vector1.remove(userID);


Enumeration enu=vector2.elements();

while(enu.hasMoreElements())
{
CreateServerThread th=(CreateServerThread)enu.nextElement();
if(th!=this && th.isAlive())
th.out.writeUTF("下线了:"+str.substring(str.indexOf(":")+1));
th.out.writeUTF(str.substring(str.indexOf(":")+1)+"……下线了");
}
vector2.remove(this);
break;
}
else
{
enu=vector2.elements();
while(enu.hasMoreElements())
{
CreateServerThread th=(CreateServerThread)enu.nextElement();
th.out.writeUTF(revStr);
}
}
}
}
catch(IOException e)
{
try{
userID=vector1.indexOf(str);
vector1.remove(userID);
Enumeration enun=vector2.elements();
while(enun.hasMoreElements())
{
CreateServerThread th=(CreateServerThread)enun.nextElement();
if(th!=this && th.isAlive())
th.out.writeUTF("下线了:"+str.substring(str.indexOf(":")+1));
th.out.writeUTF(str.substring(str.indexOf(":")+1)+"……下线了");
}
vector2.remove(this);
return;
} catch(Exception ee){return;}
}
}
}



[解决办法]
客户端源代码



import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.*;
import java.io.*;
import java.util.*;

//多用户聊天室客户端主程序(主程序)//

public class Chat{

boolean packFrame=false;
Chat()
{
chatFrame frame=new chatFrame();

Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize=frame.getSize();


if(frameSize.height>screenSize.height)
{
frameSize.height=screenSize.height;
}
if(frameSize.width>screenSize.width)
{
frameSize.width=screenSize.width;
}
frame.setLocation((screenSize.width-frameSize.width)/2,(screenSize.height-frameSize.height)/2);
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{ new Chat();}
});
}
}






// 实现客户端聊天功能程序//
class chatFrame extends JFrame implements ActionListener,Runnable
{
LoginFrame frame=new LoginFrame();
Thread thread;
JPanel contentPane;
JScrollPane jscrollpane1=new JScrollPane();
JScrollPane jscrollpane2=new JScrollPane();
JButton jBtnSend=new JButton("发送");
JButton jBtnClear=new JButton("清空");

JTextArea jTextArea1=new JTextArea();
JTextArea jTextArea2=new JTextArea();

JScrollPane jscrollpane3=new JScrollPane();
JList<Object> jList1=new JList<Object>();
Socket socket;
int port=10000;
DataInputStream in;
DataOutputStream out;
Vector<Object> vector=new Vector<Object>();
String chatstr,str;

public chatFrame()
{
setTitle("逍遥聊天室");
setSize(602,515);
this.setResizable(false);
this.setVisible(false);
try
{
setDefaultCloseOperation(EXIT_ON_CLOSE);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)


{
try{
out.writeUTF("下线了:"+frame.name+"/"+frame.sex);
out.close();
in.close();
socket.close();
}
catch(Exception ee){}
finally
{
frame.dispose();
dispose();
}
}
}
);
jbInit();
} catch (Exception exception)
{ exception.printStackTrace();}
}

void jbInit() throws Exception{
frame.setVisible(true);
jscrollpane1.setBounds(2,2,445,320);
jscrollpane2.setBounds(1,333,448,95);
jscrollpane3.setBounds(458,6,139,424);
jBtnSend.setBounds(93,441,78,31);
jBtnClear.setBounds(185,441,76,31);
jTextArea1.setEditable(false);
contentPane=(JPanel)getContentPane();
contentPane.setLayout(null);
contentPane.add(jscrollpane2);
contentPane.add(jscrollpane1,null);
contentPane.add(jscrollpane3);
contentPane.add(jBtnSend);
contentPane.add(jBtnClear);
jscrollpane1.getViewport().add(jTextArea1);
jscrollpane2.getViewport().add(jTextArea2);
jscrollpane3.getViewport().add(jList1);
jBtnClear.addActionListener(this);
jBtnSend.addActionListener(this);


try{
InetAddress address=InetAddress.getLocalHost();
socket=new Socket(address.getHostAddress(),port);
// socket=new Socket("127.0.0.1",port);//
in=new DataInputStream(socket.getInputStream());
out=new DataOutputStream(socket.getOutputStream());
} catch(Exception e){
setVisible(true);
jTextArea2.setText("无法与服务器连接,请退出……");
}
if(thread == null)
{
thread = new Thread(this);
thread.start();
}
frame.setClection(socket,in,out);
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==jBtnSend)
{
sendStr();
}
if(e.getSource()==jBtnClear)
{ jTextArea1.setText("");
}
}
public void sendStr()
{
chatstr=jTextArea2.getText();
if(chatstr.equals(""))
{
jTextArea1.setText("不能发送内容为空");
return;
}
try{
out.writeUTF(frame.name+":"+chatstr);
jTextArea2.setText("");
}catch(Exception ee){ }
}

public void run()
{
String s1=null;
String ss=null;
String s=null;
while(true)
{
try{
s1=in.readUTF();}
catch(Exception ee)
{
vector.removeAllElements();
jList1.setListData(vector);
jTextArea2.setText("已经与服务器断开……");
return;
}
if(s1.startsWith("可以注册"))
{
frame.setVisible(false);
setVisible(true);


setTitle("昵称……"+frame.getName());

continue;
}
else if(s1.startsWith("该用户名已注册"))
{
frame.jTextField1.setText("请重新输入昵称");
continue;
}
else if(s1.startsWith("新用户"))
{
StringTokenizer st=new StringTokenizer(s1,":");
ss=null; s=null;
ss=st.nextToken();
s=st.nextToken();
vector.addElement(s);
jList1.setListData(vector);
continue;
}
else if(s1.startsWith("下线了"))
{
StringTokenizer st=new StringTokenizer(s1,":");

ss=null; s=null;
ss=st.nextToken();
s=st.nextToken();
vector.removeElement(s);
jList1.setListData(vector);
continue;
}
jTextArea1.append(s1+"\n");
}
}
}







// 客户端主程序登录界面//
class LoginFrame extends JFrame implements ActionListener
{

JPanel contentPane;
JLabel jLabel1=new JLabel();
JTextField jTextField1=new JTextField();
ButtonGroup buttonGroup1=new ButtonGroup();
JRadioButton jRadioButton1=new JRadioButton("男");
JRadioButton jRadioButton2=new JRadioButton("女");

JLabel jLabel2=new JLabel("性别");
JButton jButton1=new JButton();
JButton jButton2=new JButton();

String sex="男";
String name=null;
boolean bool=false;

Socket socket;
DataInputStream in;
DataOutputStream out;

public LoginFrame()
{

setSize(new Dimension(400,210));
setTitle("登录界面");
setVisible(true);
contentPane=(JPanel)getContentPane();
contentPane.setLayout(null);
this.setResizable(false);
jLabel1.setFont(new Font("Dialog",15,15));
jLabel1.setText("请输入您的昵称:");
jLabel1.setBounds(53,20,113,44);

jTextField1.setBounds(182,25,154,33);

jRadioButton1.setFont(new Font("Dialog",Font.PLAIN,13));


jRadioButton1.setSelected(true);
jRadioButton1.setBounds(186,64,91,25);
jRadioButton1.addActionListener(this);

jRadioButton2.setFont(new Font("Dialog",Font.PLAIN,13));
jRadioButton2.setBounds(187,90,91,25);
jRadioButton2.addActionListener(this);

jLabel2.setFont(new Font("Dialog",Font.PLAIN,15));
jLabel2.setBounds(136,80,34,16);

jButton1.setBounds(182,138,71,25);
jButton1.setText("确定");
jButton1.addActionListener(this);
jButton2.setBounds(264,138,71,25);
jButton2.setText("取消");
jButton2.addActionListener(this);

contentPane.add(jLabel1);
contentPane.add(jTextField1);
contentPane.add(jRadioButton1);
contentPane.add(jRadioButton2);
contentPane.add(jLabel2);
contentPane.add(jButton2);
contentPane.add(jButton1);
buttonGroup1.add(jRadioButton1);
buttonGroup1.add(jRadioButton2);
Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize=getSize();

if(frameSize.height>screenSize.height)
{ frameSize.height=screenSize.height;}
if(frameSize.width>screenSize.width)
{ frameSize.width=screenSize.width;}
setLocation((screenSize.width-frameSize.width)/2, (screenSize.height-frameSize.height)/2);
setVisible(true);
}


public void setClection(Socket soc,DataInputStream din,DataOutputStream dout)
{
socket=soc;
in=din;
out=dout;
}

public String getName(){
return name;
}

public void actionPerformed(ActionEvent e)
{
if(e.getSource() == jRadioButton1) sex="男";
if(e.getSource() == jRadioButton2) sex="女";
if(e.getSource() == jButton2) jTextField1.setText("");
else if(e.getSource()==jButton1)
{
if(jTextField1.getText().equals(""))
{
jTextField1.setText("请输入昵称");
return;
}
name=jTextField1.getText();
try{
out.writeUTF("新用户:"+name+"/"+sex);
} catch(Exception ee){return;}
}
}
}



[解决办法]
偶然想出了这个问题的解决之法
[解决办法]
Exception in thread "Thread-2" java.util.NoSuchElementException



已经被你next到尾了,没得next了,所以就异常了。

如果要安全就用hasMoreTokens()来做检测。


不过老实说,你这个通讯写的太复杂了,借助点现成手段吧。。。

把你要发送的数据,封装成值对象,然后用 ObjectOutputStream写,用ObjectInputStream读,就好了。

或者封装成JSON串,然后直接发送字符串和接受字符串,再重构对象,都很方便,没必要自己hardcode协议解析过程。

读书人网 >J2ME开发

热点推荐