java socket 与linux c通信问题
97w211 发表于: 2010-2-09 18:08 来源: 科技复兴
如题,用java做客户端,linux的c程序做服务器端。目前客户端向服务器端发送信息已经没问题,但是在添加服务器端向客户端发送信息的功能时却出现了死循环。在Eclipse调试了一下客户端发现是在in.readLine()卡住了,具体代码如下:
java 客户端:
Java code
package linux;
import java.net.*;
import java.*;
import java.util.*;
import java.io.OutputStream;
import java.io.InputStream;
import java.io.*;
import java.io.BufferedReader;
import java.net.InetSocketAddress;
public class java_c_client{
public static void main(String[] argv){
Socket socket = null;
InputStream in = null;
BufferedReader input = null;
byte [] b = new byte[5];
String url = "219.216.101.210";
int PORT = 9999;
try{
int num = -1;
socket = new Socket();
socket.setReuseAddress(true);
InetSocketAddress socketAddr = new InetSocketAddress(url, PORT);
System.out.println("ip==="+socket.getInetAddress()+"/t port=="+socket.getLocalPort());
socket.connect(socketAddr);
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
System.out.println("ip==="+socket.getInetAddress()+"/t port=="+socket.getLocalPort());
input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
in = socket.getInputStream();
byte[] buffer = new byte[20];
in.read(buffer, 0, 20);
String name = "hello";
//out = socket.getOutputStream();
while(num==-1){
//out = socket.getOutputStream();]
System.arraycopy(name.getBytes(),0,b,0,name.getBytes().length);//将name数据内容从0开始拷贝到字节数组b
dos.write(b);
if (input.readLine() != null) {
System.out.println("服务器反馈信息:"+input.readLine());
}else {
System.out.println("服务器无反馈!");
}
/* for (int i = 0; i < buffer.length; i++) {
System.out.print(buffer[i]);
}*/
num ++;
}
if(num>-1){
dos.flush();
socket.close();
}
System.out.println("finish closing ...........");
}catch(Exception e){
e.printStackTrace();
}
}
}
Linux C服务器端
C/C++ code
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#define MYPORT 9999
#define BACKLOG 10
int main()
{
int sockfd, new_fd;
char msg[10] = "Got it!/n";
int length = strlen(msg); /* listen on sock_fd, new connection on new_fd */
struct sockaddr_in my_addr; /* 地址信息 */
struct sockaddr_in their_addr; /* connector's address information */
int sin_size;
char buf[128];
sockfd = socket(AF_INET, SOCK_STREAM, 0); /* 错误检查*/
my_addr.sin_family = AF_INET; /* host byte order */
my_addr.sin_port = htons(MYPORT); /* short, network byte order */
my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */
bzero(&(my_addr.sin_zero),8); /* zero the rest of the struct */
bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));
listen(sockfd, BACKLOG);
/*
sin_size = sizeof(struct sockaddr_in);
//new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);
int num = -1;
while(num==-1)
{
new_fd=accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);
int n=recv(new_fd,buf,2,0);
num++;
}
printf("buf==%s",buf);
*/
sin_size = sizeof(struct sockaddr_in);
new_fd=accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);
int n=recv(new_fd,buf,128,0);
if(n > 0)
{
printf("buf==%s/n",buf);
printf("the length of message is:%d/n",length);
if(send(sockfd,msg,length+1,0) == -1)
perror("can't send message/n");
}
close(new_fd);
close(sockfd);
return 0;
}