读书人

java Socket菜鸟有关问题求教

发布时间: 2013-11-13 14:04:18 作者: rapoo

java Socket初学者问题,求教
我从书上看来的代码,
先看代码:


import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;


public class TCPEchoClient {
public static void main(String[] arg) throws UnknownHostException, IOException{
String[] args = {
"192.168.6.196",
"i love you ",
"8"
};
if ((args.length < 2) || (args.length > 3))
throw new IllegalArgumentException("Parameter(s): <Server> <Word> [<Port>]");
String server = args[0];
byte[] data = args[1].getBytes();
int servPort = (args.length == 3) ? Integer.parseInt(args[2]) : 7;
Socket socket = new Socket(server, servPort);
System.out.println("Connected to server...sending echo string");
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
out.write(data);
int totalBytesRcvd = 0;
int bytesRcvd;
while (totalBytesRcvd < data.length) {
if ((bytesRcvd = in.read(data, totalBytesRcvd,
data.length - totalBytesRcvd)) == -1)
throw new SocketException("Connection closed prematurely");
totalBytesRcvd += bytesRcvd;
}
System.out.println("Received: " + new String(data));
socket.close();
}
}

jdk javac 编译:
编译 : ok [可以cmd看]
运行 :报错,Exception in thread "main" java.net.ConnectException: Connection refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at TCPEchoClient.main(TCPEchoClient.java:20)
接着,换用MyEclipse(我用的是6.5,懒得用那么新,节省资源):
编译并运行:报错,错误一模一样 ...

-------------------------------------------

初学,真心解决不了,求教!
[解决办法]
你的客户端的代码呢?
[解决办法]
你的服务器端代码呢?刚才说错了,不好意思
[解决办法]
没有server当然连不上。
[解决办法]
socket都是成对出现的,而且启动顺序是先启动服务端代码(ServerSocket说:我在这儿等着你到来),然后启动客户端代码(Socket:留下来~)。

仔细看看书,应该还有个ServerSocket的实例的。
[解决办法]
嗯,目测你本机ip是192.168.6.196。
因此应该编写另外一个服务端程序,监听本机ip,然后先运行那个程序,再运行本程序。
[解决办法]
不知道服务,连不上服务,看一下端口是否有问题,
[解决办法]
自己改下对应的端口号

猜测应该是80,常用WEB端口号
String[] args = { "192.168.6.196", "i love you ", "80" };



自己配置的端口号推荐3000以后的端口,比较可靠不容易占用


具体查阅的话,可以找服务那边的
ServerSocket serverSocket = new ServerSocket(5000);

这样一句,括号里面的代表服务器的端口号
[解决办法]
再补一句,如果是端口占用了不是报那个错误,是这个:

java.net.BindException: Address already in use: JVM_Bind
at java.net.TwoStacksPlainSocketImpl.socketBind(Native Method)
at java.net.TwoStacksPlainSocketImpl.socketBind(Unknown Source)
at java.net.AbstractPlainSocketImpl.bind(Unknown Source)
at java.net.TwoStacksPlainSocketImpl.bind(Unknown Source)
at java.net.PlainSocketImpl.bind(Unknown Source)
at java.net.ServerSocket.bind(Unknown Source)
[解决办法]
引用:
Quote: 引用:

嗯,目测你本机ip是192.168.6.196。
因此应该编写另外一个服务端程序,监听本机ip,然后先运行那个程序,再运行本程序。


我初学,不懂 ?

书上就这个代码啊,然后直接测试,书上说代码通过了,还写了结果 。


可是我自己,无论是那书上的源代码,还是自己改编的代码,都抱错,都是Connection refused:connect!

书上应该是有两段代码的,只有先运行服务器上那部分代码,再运行客户端上那部分代码,才能成功的……
[解决办法]
引用:
Quote: 引用:

嗯,目测你本机ip是192.168.6.196。
因此应该编写另外一个服务端程序,监听本机ip,然后先运行那个程序,再运行本程序。


我初学,不懂 ?

书上就这个代码啊,然后直接测试,书上说代码通过了,还写了结果 。

可是我自己,无论是那书上的源代码,还是自己改编的代码,都抱错,都是Connection refused:connect!
建议楼主先把理论学一下,再开始写代码吧,理论是铺垫啊……
[解决办法]
把客户端和服务端的代码都运行起来 这样才能连通
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

嗯,目测你本机ip是192.168.6.196。
因此应该编写另外一个服务端程序,监听本机ip,然后先运行那个程序,再运行本程序。


我初学,不懂 ?

书上就这个代码啊,然后直接测试,书上说代码通过了,还写了结果 。

可是我自己,无论是那书上的源代码,还是自己改编的代码,都抱错,都是Connection refused:connect!
书上应该是有两段代码的,只有先运行服务器上那部分代码,再运行客户端上那部分代码,才能成功的……


这些代码在书上的18 - 20 页。
可是,书上的确只有这一段,不同的是,它上面说了这段代码后,然后直接就javac编译运行。

有两个代码,可他们真的不是相关联的,不信我吧源代码发给你:
------------ TCPEchoClient -------------

import java.net.Socket;
import java.net.SocketException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class TCPEchoClient {

public static void main(String[] args) throws IOException {

if ((args.length < 2)
[解决办法]
(args.length > 3)) // Test for correct # of args
throw new IllegalArgumentException("Parameter(s): <Server> <Word> [<Port>]");

String server = args[0]; // Server name or IP address
// Convert argument String to bytes using the default character encoding
byte[] data = args[1].getBytes();

int servPort = (args.length == 3) ? Integer.parseInt(args[2]) : 7;

// Create socket that is connected to server on specified port
Socket socket = new Socket(server, servPort);
System.out.println("Connected to server...sending echo string");

InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();

out.write(data); // Send the encoded string to the server

// Receive the same string back from the server
int totalBytesRcvd = 0; // Total bytes received so far
int bytesRcvd; // Bytes received in last read
while (totalBytesRcvd < data.length) {
if ((bytesRcvd = in.read(data, totalBytesRcvd,
data.length - totalBytesRcvd)) == -1)
throw new SocketException("Connection closed prematurely");
totalBytesRcvd += bytesRcvd;
} // data array is full

System.out.println("Received: " + new String(data));

socket.close(); // Close the socket and its streams
}
}


---------------- TCPEchoServer ---------------------

import java.net.*; // for Socket, ServerSocket, and InetAddress
import java.io.*; // for IOException and Input/OutputStream

public class TCPEchoServer {

private static final int BUFSIZE = 32; // Size of receive buffer

public static void main(String[] args) throws IOException {

if (args.length != 1) // Test for correct # of args
throw new IllegalArgumentException("Parameter(s): <Port>");

int servPort = Integer.parseInt(args[0]);

// Create a server socket to accept client connection requests


ServerSocket servSock = new ServerSocket(servPort);

int recvMsgSize; // Size of received message
byte[] receiveBuf = new byte[BUFSIZE]; // Receive buffer

while (true) { // Run forever, accepting and servicing connections
Socket clntSock = servSock.accept(); // Get client connection

SocketAddress clientAddress = clntSock.getRemoteSocketAddress();
System.out.println("Handling client at " + clientAddress);

InputStream in = clntSock.getInputStream();
OutputStream out = clntSock.getOutputStream();

// Receive until client closes connection, indicated by -1 return
while ((recvMsgSize = in.read(receiveBuf)) != -1) {
out.write(receiveBuf, 0, recvMsgSize);
}

clntSock.close(); // Close the socket. We are done with this client!
}
/* NOT REACHED */
}
}



这就是所谓客户端和服务器端代码,我书里面两个例子真是独立的,各自有各自的main。
所以 .......
---------------
回到刚才的问题,求科普,求解!
嗯 就该这样,你是在哪运行?Eclipse还是命令行?Eclipse的话就先编译成class再放到目录下用命令行运行:启动2个命令行,第一个命令行先运行server那个程序,然后再用第二个命令行运行client那个程序。

读书人网 >J2SE开发

热点推荐