我用Java做了个UDP服务器,再用VB客户机访问是,但是总是提示10014错误。 说明:其中的Java程序与Java写的客户机能正常通信,而使用的VB程序也可以与VB写的程序正常使用。 但是下面的JAVA和VB却无法通信。以下分别给出VB和Java的完整代码,请各位指点下该如何修改,谢谢先。 =================== VB代码:
Private Sub Command1_Click()
End
End Sub Private Sub Command2_Click()
vbUDPClient.SendData txtSend.Text
End Sub Private Sub Form_Load()
'控件的名字为 udpPeerA
With vbUDPClient
'重点:必须将 RemoteHost 的值修改为计算机的名字。
.RemoteHost = "dearsun"
'.RemoteHost = "127.0.0.1"
'.RemoteHost = "localhost"
.RemotePort = 6666 '连接的端口号。
.LocalPort = 1002 '该Winsock控制将使用的本地端口号,便于其它方与之通讯
.Bind 1002 '绑定到本地的端口。
End With
End Sub Private Sub txtSend_Change()
'在键入文本时,立即将其发送出去。
vbUDPClient.SendData txtSend.Text
End Sub Private Sub vbUDPClient_DataArrival(ByVal bytesTotal As Long)
Dim strData As String
vbUDPClient.GetData strData, vbString
txtOutput.Text = strData
End Sub
================================== Java代码:
//chatServer.java import java.io.*;
import java.net.*; public class chatServer
{
public static void main(String[] str)
{
ServerSocket srvSocket;
Socket sSocket;
int srvPort = 6666; //服务器服务端口 ObjectOutputStream objOut=null;
ObjectInputStream objIn=null; try{
srvSocket=new ServerSocket(srvPort);
System.out.println("Waiting for client's connecting..."); sSocket=srvSocket.accept(); //等待客户机连接请求 System.out.println("Client connected, you may Exit this program by type 'QUIT'");
System.out.println("***************************************\n");
objOut=new ObjectOutputStream(sSocket.getOutputStream());
objIn=new ObjectInputStream(sSocket.getInputStream()); }catch(Exception e)
{
System.exit(0);
}
//启动发送消息线程类
sendMsgOut send=new sendMsgOut(objOut);
send.start(); //启动接收消息线程类
getMsgFromClient get=new getMsgFromClient(objIn);
get.start();
}
}
//发送消息线程类
class sendMsgOut extends Thread
{
ObjectOutputStream objOut=null; public sendMsgOut(ObjectOutputStream out)
{
objOut=out;
} public void run()
{
String strMsg=""; while(true)
{
try{
//发送一条消息
strMsg=(new BufferedReader(new InputStreamReader(System.in))).readLine();
objOut.writeObject(strMsg);
if (strMsg.equals("QUIT"))//服务器退出聊天
{
System.out.println("服务器退出聊天。\n");
System.exit(0);
}
}catch(Exception e){}
//System.out.println(strMsg);
}
}
}
//接收消息线程类
class getMsgFromClient extends Thread
{
ObjectInputStream objIn; public getMsgFromClient(ObjectInputStream in)
{
objIn=in;
} public void run()
{
String strMsg=""; while(true)
{
try{
//接收一条消息
strMsg=(String)objIn.readObject();
System.out.println("Client said---: "+strMsg); if (strMsg.equals("QUIT"))//客户机退出聊天
{
System.out.println("客户机退出聊天。\n");
System.exit(0);
}
}catch(Exception e){}
}
}
}
Private Sub Command1_Click()
End
End Sub Private Sub Command2_Click()
vbUDPClient.SendData txtSend.Text
End Sub Private Sub Form_Load()
'控件的名字为 udpPeerA
With vbUDPClient
'重点:必须将 RemoteHost 的值修改为计算机的名字。
.RemoteHost = "dearsun"
'.RemoteHost = "127.0.0.1"
'.RemoteHost = "localhost"
.RemotePort = 6666 '连接的端口号。
.LocalPort = 1002 '该Winsock控制将使用的本地端口号,便于其它方与之通讯
.Bind 1002 '绑定到本地的端口。
End With
End Sub Private Sub txtSend_Change()
'在键入文本时,立即将其发送出去。
vbUDPClient.SendData txtSend.Text
End Sub Private Sub vbUDPClient_DataArrival(ByVal bytesTotal As Long)
Dim strData As String
vbUDPClient.GetData strData, vbString
txtOutput.Text = strData
End Sub
================================== Java代码:
//chatServer.java import java.io.*;
import java.net.*; public class chatServer
{
public static void main(String[] str)
{
ServerSocket srvSocket;
Socket sSocket;
int srvPort = 6666; //服务器服务端口 ObjectOutputStream objOut=null;
ObjectInputStream objIn=null; try{
srvSocket=new ServerSocket(srvPort);
System.out.println("Waiting for client's connecting..."); sSocket=srvSocket.accept(); //等待客户机连接请求 System.out.println("Client connected, you may Exit this program by type 'QUIT'");
System.out.println("***************************************\n");
objOut=new ObjectOutputStream(sSocket.getOutputStream());
objIn=new ObjectInputStream(sSocket.getInputStream()); }catch(Exception e)
{
System.exit(0);
}
//启动发送消息线程类
sendMsgOut send=new sendMsgOut(objOut);
send.start(); //启动接收消息线程类
getMsgFromClient get=new getMsgFromClient(objIn);
get.start();
}
}
//发送消息线程类
class sendMsgOut extends Thread
{
ObjectOutputStream objOut=null; public sendMsgOut(ObjectOutputStream out)
{
objOut=out;
} public void run()
{
String strMsg=""; while(true)
{
try{
//发送一条消息
strMsg=(new BufferedReader(new InputStreamReader(System.in))).readLine();
objOut.writeObject(strMsg);
if (strMsg.equals("QUIT"))//服务器退出聊天
{
System.out.println("服务器退出聊天。\n");
System.exit(0);
}
}catch(Exception e){}
//System.out.println(strMsg);
}
}
}
//接收消息线程类
class getMsgFromClient extends Thread
{
ObjectInputStream objIn; public getMsgFromClient(ObjectInputStream in)
{
objIn=in;
} public void run()
{
String strMsg=""; while(true)
{
try{
//接收一条消息
strMsg=(String)objIn.readObject();
System.out.println("Client said---: "+strMsg); if (strMsg.equals("QUIT"))//客户机退出聊天
{
System.out.println("客户机退出聊天。\n");
System.exit(0);
}
}catch(Exception e){}
}
}
}
1)这是TCP,不是楼主说的UDP通信.
2)JAVA中与其它语言如VB通信时,不要使用ObjectInputStream与ObjectOutputStream这些对象流.你应先确定好网络通信双方的应用层的通信协议(如:数据的格式与时序),然后在JAVA一方使用字节汉流或字符流进行通信.
3)另外:
//发送一条消息
objOut.writeObject(strMsg);
之后,要用:
objOut.flush();
及时刷新一下.