java socket 与linux c通信问题

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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值