java为服务器端,c为客户端 socket通讯问题

warss 2010-05-21 08:17:19
客户端只是发送数据时可以成功,但要接收服务器的回应时收不到
做java客户端测试也可以成功收发,所以感觉是c客户端的问题
java服务器端主要代码:
BufferedReader breader=new BufferedReader(new InputStreamReader(clientInput));

Socket socket;
InputStream clientInput = socket.getInputStream();;
OutputStream clientOutput =socket.getOutputStream(); ;

String strLine=breader.readLine();
String str="get your data:"+ strLine;
PrintWriter printWriter=new PrintWriter(clientOutput,true);
printWriter.println(str);
System.out.println("Finish sending to client...");

c客户端主要代码:
int connectServer(char* addr,int port){
struct sockaddr_in saddr;
int m_iSock;
int i,j;

m_iSock = socket(AF_INET,SOCK_STREAM,0);
if(m_iSock < 0){
printf("call to socket() failed\n");
exit(0);
}
memset(&saddr,0,sizeof(saddr));
saddr.sin_family = AF_INET;

saddr.sin_addr.s_addr = inet_addr(addr);
saddr.sin_port = htons(port);

if(connect(m_iSock,(struct sockaddr *)&saddr,sizeof(saddr))==-1){
printf("Call to connect() failed.\n");
close(m_iSock);
exit(1);
}

return m_iSock;
}

main(){
int m_iSock;
int sockPort=3333;
char sockServer[]="192.168.1.101";
m_iSock=connectServer(sockServer,sockPort);

if (send(m_iSocket, "***",len, 0) == -1)
{
printf("Call to send() failed.\n");
exit(1);
}
close(m_iSock);
printf("send sucessful\n");
}

这是客户端可以成功发送数据的代码,现在问题是:
如果在close(m_iSock);前加上收数据的recv(m_iSocket,m_vInBuf,sizeof(m_vInBuf)/sizeof(char),0);客户端就会停在这句上等待数据,而服务器端也会停在 String strLine=breader.readLine(); 等待数据,两边都停了...调试发现客户端必须先close(socket),服务器端才能正常接收,但如果close,客户端又如何接受服务器返回的数据??

折腾了一天了,求教高手!!!!
谢谢谢谢!!!!!!!!!!!
...全文
280 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
warss 2010-05-22
  • 打赏
  • 举报
回复
解决了,readLine()要读到'\n'才结束,如果发送的数据没有\n就一直等待。
warss 2010-05-22
  • 打赏
  • 举报
回复
在顶一下,高手帮忙看看阿,谢谢了!!!
warss 2010-05-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dinjay 的回复:]
客户端中可以起两个线程,一个发送,一个接收。这样没影响的
[/Quote]
那如何用同一个socket?
dinjay 2010-05-21
  • 打赏
  • 举报
回复
客户端中可以起两个线程,一个发送,一个接收。这样没影响的
dinjay 2010-05-21
  • 打赏
  • 举报
回复
初学java的新人路过~~~mark
shuaiAWP 2010-05-21
  • 打赏
  • 举报
回复

InputStream clientInput = socket.getInputStream();;
OutputStream clientOutput =socket.getOutputStream(); ;

DataInputStream dis = new DataInputStream(clientInput);
DataOutpuStream dos = new DataOutputStream(clientOutput);
dis.readXXX();//书上好像是这么写的
String strLine=breader.readLine();
shiweifu 2010-05-21
  • 打赏
  • 举报
回复
readLine()
在JAVA中如何定义一行数据?
我觉得问题是在这,LZ看看JDK中的说明?
环境:Windows XP SP3、 VC++ 6.0、 Windows 2003 SDK 使用步骤: 1、下载解压之后,使用VC++ 6.0打开两个工程:一个是SocketServer和一个ClientSocket工程。 2、首先运行服务器工程,选默认的口1008 3、然后运行客户工程,选默认的口1008和默认的服务器地址 4、再运行多个客户进程 5、如果一切正常,可以每个客户的消息发送,我们可以在服务和各个客户同步看到消息 实现一个服务器对多个客户的关键是,在服务的使用集合CPtrList类用保存客户socket对象,思想与Java中的编程思想一样,只不过Java中会使用多线程技术,在Vector集合保存客户socket对象,而MFC框架提供了CSocket类,它是一个异步通信的类,所以看上去代码比较Java的多线程代码简单的实现了一个对多的即时通讯功能。另外,MFC提供了CSocketFile类和CArchive类与CSocket类实现了C++的网络通讯编程功能。 本示例注释非常详细,所有的辅助类都放一个util目录中,然后在工程中分了一个目录来管理这些辅助类,使用代码非常清晰。手动书写部分的代码是按Java的规范书写,当然其它代码由IDE生成的,所以是MS的风格,所以当你看代码时,只要是使用“骆驮命名法”的方法都是本人书写的功能性代码。 参看的思路:在服务要从回调方法onAccept读起;而客户代码主要从OnSendButton方法读起,即可理解整个代码的意思。 阅读对象:具有JavaSocket编程经验的人员,并且希望能够书写出比Java效率更高的即时通讯程序的人员

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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