hitcser01 发表于 2013-04-01 22:38

java用socket通信时java.net.SocketException的问题

1.本意是简单测试一下Linux环境下java 和 c的通信,程序源自网上,如下:/****************** Client program *****************/
import java.net.*;
import java.io.*;
public class Client {
static Socket server;
public static void main(String[] args) throws Exception {
   server = new Socket(InetAddress.getLocalHost(), 5678);
   BufferedReader in = new BufferedReader(new InputStreamReader(server.getInputStream()));
   PrintWriter out = new PrintWriter(server.getOutputStream());
   BufferedReader wt = new BufferedReader(new InputStreamReader(System.in));
   while (true) {
    String str = wt.readLine();
    out.println(str);
    out.flush();
    if (str.equals("end")) {
   break;
    }
   }
   server.close();
}
}2. java Client 时报错:
Exception in thread "main" java.net.SocketException: Invalid argument or cannot assign requested address
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:327)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:193)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:180)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:384)
        at java.net.Socket.connect(Socket.java:546)
        at java.net.Socket.connect(Socket.java:495)
        at java.net.Socket.<init>(Socket.java:392)
        at java.net.Socket.<init>(Socket.java:235)
        at Client.main(Client.java:7)


3.网上说是ipv6的事,禁用即可。
问题是我需要使用ipv6,怎么办?

谢谢?

方兆国 发表于 2013-04-14 09:44

Invalid argument or cannot assign requested address
不能获取服务器地址

方兆国 发表于 2013-04-14 09:46


Socket要求先开服务器,后开客户端
可能是你的服务器程序没有打开server = new Socket(InetAddress.getLocalHost(), 5678);
不建议这种写法,InetAddress.getLocalHost(),你确定你的服务器程序就在你的电脑上

hitcser01 发表于 2013-04-14 10:28

回复 3# 方兆国


谢谢您的帮助!
都在本地PC上,服务器用C写,先运行了;
再运行JAVA的,还是一样的错误哦!:?:

方兆国 发表于 2013-04-14 14:37

回复 4# hitcser01


   单看客户端代码的话,看不出来问题啊

hitcser01 发表于 2013-04-14 15:20

本帖最后由 hitcser01 于 2013-04-14 15:21 编辑

回复 5# 方兆国
这样啊,我疏忽了,我不太懂这个,现在须要简单的用一用;
要是能看出个所以然来,还请帮帮忙了。//都是网上看的。
服务器输出停在这里:调用listen函数成功,宣告服务器已经可以接受连接请求!/****************** server program *****************/
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <stdlib.h>
#include <sys/un.h>
#include <pthread.h>
#include <arpa/inet.h>
int sockfd,newfd;
void *read_socket();
int main()
{
    int ret;
    pthread_t read_tid,write_tid;
    struct sockaddr_in server_addr;
    server_addr.sin_family=AF_INET;/*设置域为IPV4*/
    server_addr.sin_addr.s_addr=INADDR_ANY;/*绑定到 INADDR_ANY 地址*/
    server_addr.sin_port=htons(5678);/*通信端口号为5678,注意这里必须要用htons函数处理一下,不能直接写5678,否则可能会连不上*/
    sockfd=socket(AF_INET,SOCK_STREAM,0);
    if (sockfd<0)
    {
      printf("调用socket函数建立socket描述符出错!\n");
         exit(1);
    }
    printf("调用socket函数建立socket描述符成功!\n");
    ret=bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(server_addr));
    perror("server");
    if (ret<0)
    {
      printf("调用bind函数绑定套接字与地址出错!\n");
         exit(2);
    }
    printf("调用bind函数绑定套接字与地址成功!\n");
    ret=listen(sockfd,4);
    if (ret<0)
    {
      printf("调用listen函数出错,无法宣告服务器已经可以接受连接!\n");
         exit(3);
    }
    printf("调用listen函数成功,宣告服务器已经可以接受连接请求!\n");
    newfd=accept(sockfd,NULL,NULL);/*newfd连接到调用connect的客户端*/
    if (newfd<0)
    {
      printf("调用accept函数出错,无法接受连接请求,建立连接失败!\n");
         exit(4);
    }
    printf("调用accept函数成功,服务器与客户端建立连接成功!\n");
   
    /** 服务器端建立一个线程,负责从socket读取数据,当然此处并不一定非要建立一个新线程,直接在原线程中写也可以 **/
    pthread_create(&read_tid,NULL,read_socket,NULL);
   
    /********************* 令原线程睡眠 ************************/
    while(1)
    {
      sleep(10000);
    }
}
/****************** 从socket读取数据 ********************/
void *read_socket()
{
    int recv_num,recv_num_total=0;
    char recv_buf;
    while (1)
    {
      memset(recv_buf,0,sizeof(recv_buf));/*清空一下recv_buf缓存区*/
      recv_num=recv(newfd,recv_buf,26,0);
      if (recv_num<0)
            printf("服务器端:调用recv接收失败!\n");
      else if(recv_num>0)
      {
            recv_num_total+=recv_num;
            printf("服务器端:调用recv接收成功!本次接收到%d个字节,内容为:\"%s\"。共收到%d个字节的数据。\n",recv_num,recv_buf,recv_num_total);
            sync();
      }
      else/*收到数据为0,表明服务器与客户端的连接已经中断*/
      {
            printf("服务器端:与客户端的连接已中断,当前共收到%d个字节的数据。服务器将再次等待客户端的连接。\n",recv_num_total);
            newfd=accept(sockfd,NULL,NULL);/*当客户端退出后,再次开始接收客户端的连接*/
      }
      sleep(1);
    }
}

方兆国 发表于 2013-04-14 15:39

回复 6# hitcser01


    很抱歉……我不会用C/C++做套接字

不过有一下几点提示:
1、服务器端应该不断循环去监听端口,察看是否有客户端接入
2、客户端接入后,服务器端应该再开一个线程去处理与客户端的对话,如果不新开线程的话,那么只有等这个客户端与服务器端对话完毕,服务器端再监听端口

hitcser01 发表于 2013-04-15 09:19

回复 7# 方兆国


    :D 非常感谢您的热心帮助,等我自己看看书再来解决这个问题吧。

方兆国 发表于 2013-05-16 15:54

回复 8# hitcser01


   今天上网,看到这个帖子,像问一下,问题解决了没有?如果解决了的话,把方法贴一下,给大家分享一下

方兆国 发表于 2013-05-16 16:03

回复 6# hitcser01


    我自己试了一下,我的电脑里面没有<sys/socket.h>这个文件
页: [1] 2
查看完整版本: java用socket通信时java.net.SocketException的问题