免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8995 | 回复: 14
打印 上一主题 下一主题

java用socket通信时java.net.SocketException的问题 [复制链接]

论坛徽章:
2
嗜杀者
日期:2015-11-25 10:44:3015-16赛季CBA联赛之北京
日期:2016-03-20 19:50:17
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-01 22:38 |只看该作者 |倒序浏览
1.本意是简单测试一下Linux环境下java 和 c的通信,程序源自网上,如下:
  1. /****************** Client program *****************/
  2. import java.net.*;
  3. import java.io.*;
  4. public class Client {
  5. static Socket server;
  6. public static void main(String[] args) throws Exception {
  7.    server = new Socket(InetAddress.getLocalHost(), 5678);
  8.    BufferedReader in = new BufferedReader(new InputStreamReader(server.getInputStream()));
  9.    PrintWriter out = new PrintWriter(server.getOutputStream());
  10.    BufferedReader wt = new BufferedReader(new InputStreamReader(System.in));
  11.    while (true) {
  12.     String str = wt.readLine();
  13.     out.println(str);
  14.     out.flush();
  15.     if (str.equals("end")) {
  16.      break;
  17.     }
  18.    }
  19.    server.close();
  20. }
  21. }
复制代码
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,怎么办?

谢谢?

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
2 [报告]
发表于 2013-04-14 09:44 |只看该作者
  1. Invalid argument or cannot assign requested address
复制代码
不能获取服务器地址

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
3 [报告]
发表于 2013-04-14 09:46 |只看该作者

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

论坛徽章:
2
嗜杀者
日期:2015-11-25 10:44:3015-16赛季CBA联赛之北京
日期:2016-03-20 19:50:17
4 [报告]
发表于 2013-04-14 10:28 |只看该作者
回复 3# 方兆国


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

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
5 [报告]
发表于 2013-04-14 14:37 |只看该作者
回复 4# hitcser01


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

论坛徽章:
2
嗜杀者
日期:2015-11-25 10:44:3015-16赛季CBA联赛之北京
日期:2016-03-20 19:50:17
6 [报告]
发表于 2013-04-14 15:20 |只看该作者
本帖最后由 hitcser01 于 2013-04-14 15:21 编辑

回复 5# 方兆国
这样啊,我疏忽了,我不太懂这个,现在须要简单的用一用;
要是能看出个所以然来,还请帮帮忙了。//都是网上看的。
服务器输出停在这里:调用listen函数成功,宣告服务器已经可以接受连接请求!
  1. /****************** server program *****************/
  2. #include <stdio.h>
  3. #include <sys/types.h>
  4. #include <sys/socket.h>
  5. #include <string.h>
  6. #include <stdlib.h>
  7. #include <sys/un.h>
  8. #include <pthread.h>
  9. #include <arpa/inet.h>
  10. int sockfd,newfd;
  11. void *read_socket();
  12. int main()
  13. {
  14.     int ret;
  15.     pthread_t read_tid,write_tid;
  16.     struct sockaddr_in server_addr;
  17.     server_addr.sin_family=AF_INET;/*设置域为IPV4*/
  18.     server_addr.sin_addr.s_addr=INADDR_ANY;/*绑定到 INADDR_ANY 地址*/
  19.     server_addr.sin_port=htons(5678);/*通信端口号为5678,注意这里必须要用htons函数处理一下,不能直接写5678,否则可能会连不上*/
  20.     sockfd=socket(AF_INET,SOCK_STREAM,0);
  21.     if (sockfd<0)
  22.     {
  23.         printf("调用socket函数建立socket描述符出错!\n");
  24.          exit(1);
  25.     }
  26.     printf("调用socket函数建立socket描述符成功!\n");
  27.     ret=bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(server_addr));
  28.     perror("server");
  29.     if (ret<0)
  30.     {
  31.         printf("调用bind函数绑定套接字与地址出错!\n");
  32.          exit(2);
  33.     }
  34.     printf("调用bind函数绑定套接字与地址成功!\n");
  35.     ret=listen(sockfd,4);
  36.     if (ret<0)
  37.     {
  38.         printf("调用listen函数出错,无法宣告服务器已经可以接受连接!\n");
  39.          exit(3);
  40.     }
  41.     printf("调用listen函数成功,宣告服务器已经可以接受连接请求!\n");
  42.     newfd=accept(sockfd,NULL,NULL);/*newfd连接到调用connect的客户端*/
  43.     if (newfd<0)
  44.     {
  45.         printf("调用accept函数出错,无法接受连接请求,建立连接失败!\n");
  46.          exit(4);
  47.     }
  48.     printf("调用accept函数成功,服务器与客户端建立连接成功!\n");
  49.    
  50.     /** 服务器端建立一个线程,负责从socket读取数据,当然此处并不一定非要建立一个新线程,直接在原线程中写也可以 **/
  51.     pthread_create(&read_tid,NULL,read_socket,NULL);
  52.    
  53.     /********************* 令原线程睡眠 ************************/
  54.     while(1)
  55.     {
  56.         sleep(10000);
  57.     }
  58. }
  59. /****************** 从socket读取数据 ********************/
  60. void *read_socket()
  61. {
  62.     int recv_num,recv_num_total=0;
  63.     char recv_buf[50];
  64.     while (1)
  65.     {
  66.         memset(recv_buf,0,sizeof(recv_buf));/*清空一下recv_buf缓存区*/
  67.         recv_num=recv(newfd,recv_buf,26,0);
  68.         if (recv_num<0)
  69.             printf("服务器端:调用recv接收失败!\n");
  70.         else if(recv_num>0)
  71.         {
  72.             recv_num_total+=recv_num;
  73.             printf("服务器端:调用recv接收成功!本次接收到%d个字节,内容为:\"%s\"。共收到%d个字节的数据。\n",recv_num,recv_buf,recv_num_total);
  74.             sync();
  75.         }
  76.         else/*收到数据为0,表明服务器与客户端的连接已经中断*/
  77.         {
  78.             printf("服务器端:与客户端的连接已中断,当前共收到%d个字节的数据。服务器将再次等待客户端的连接。\n",recv_num_total);
  79.             newfd=accept(sockfd,NULL,NULL);/*当客户端退出后,再次开始接收客户端的连接*/
  80.         }
  81.         sleep(1);
  82.     }
  83. }
复制代码

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
7 [报告]
发表于 2013-04-14 15:39 |只看该作者
回复 6# hitcser01


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

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

论坛徽章:
2
嗜杀者
日期:2015-11-25 10:44:3015-16赛季CBA联赛之北京
日期:2016-03-20 19:50:17
8 [报告]
发表于 2013-04-15 09:19 |只看该作者
回复 7# 方兆国


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

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
9 [报告]
发表于 2013-05-16 15:54 |只看该作者
回复 8# hitcser01


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

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
10 [报告]
发表于 2013-05-16 16:03 |只看该作者
回复 6# hitcser01


    我自己试了一下,我的电脑里面没有<sys/socket.h>这个文件
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP