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,怎么办?
谢谢? Invalid argument or cannot assign requested address
不能获取服务器地址
Socket要求先开服务器,后开客户端
可能是你的服务器程序没有打开server = new Socket(InetAddress.getLocalHost(), 5678);
不建议这种写法,InetAddress.getLocalHost(),你确定你的服务器程序就在你的电脑上 回复 3# 方兆国
谢谢您的帮助!
都在本地PC上,服务器用C写,先运行了;
再运行JAVA的,还是一样的错误哦!:?: 回复 4# hitcser01
单看客户端代码的话,看不出来问题啊 本帖最后由 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);
}
} 回复 6# hitcser01
很抱歉……我不会用C/C++做套接字
不过有一下几点提示:
1、服务器端应该不断循环去监听端口,察看是否有客户端接入
2、客户端接入后,服务器端应该再开一个线程去处理与客户端的对话,如果不新开线程的话,那么只有等这个客户端与服务器端对话完毕,服务器端再监听端口 回复 7# 方兆国
:D 非常感谢您的热心帮助,等我自己看看书再来解决这个问题吧。 回复 8# hitcser01
今天上网,看到这个帖子,像问一下,问题解决了没有?如果解决了的话,把方法贴一下,给大家分享一下 回复 6# hitcser01
我自己试了一下,我的电脑里面没有<sys/socket.h>这个文件
页:
[1]
2