java Socket初学者问题,求教

weidu23 2013-10-15 03:02:18
我从书上看来的代码,
先看代码:

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,懒得用那么新,节省资源):
编译并运行:报错,错误一模一样 ...

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

初学,真心解决不了,求教!
...全文
990 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
weidu23 2013-11-12
  • 打赏
  • 举报
回复
引用 18 楼 qq690388648 的回复:
嗯 就该这样...
谢谢
西电小楠 2013-11-06
  • 打赏
  • 举报
回复
引用 14 楼 weidu23 的回复:
[quote=引用 12 楼 qq690388648 的回复:] [quote=引用 11 楼 weidu23 的回复:] [quote=引用 5 楼 qq690388648 的回复:] 嗯,目测你本机ip是192.168.6.196。 因此应该编写另外一个服务端程序,监听本机ip,然后先运行那个程序,再运行本程序。
我初学,不懂 ? 书上就这个代码啊,然后直接测试,书上说代码通过了,还写了结果 。 可是我自己,无论是那书上的源代码,还是自己改编的代码,都抱错,都是Connection refused:connect![/quote]书上应该是有两段代码的,只有先运行服务器上那部分代码,再运行客户端上那部分代码,才能成功的……[/quote] 这些代码在书上的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。 所以 ....... --------------- 回到刚才的问题,求科普,求解![/quote]嗯 就该这样,你是在哪运行?Eclipse还是命令行?Eclipse的话就先编译成class再放到目录下用命令行运行:启动2个命令行,第一个命令行先运行server那个程序,然后再用第二个命令行运行client那个程序。
weidu23 2013-11-05
  • 打赏
  • 举报
回复
先来个顶贴,以免自己的问题被沉了
weidu23 2013-11-05
  • 打赏
  • 举报
回复
引用 15 楼 u011559804 的回复:
把客户端和服务端的代码都运行起来 这样才能连通
可是,根本运行不起来 ! 因为一点击运行,就报错,就是我提问的那个Connection refused:connect! ------- 无论是Eclipse还是javac-->java都这样 ...
weidu23 2013-11-04
  • 打赏
  • 举报
回复
引用 12 楼 qq690388648 的回复:
[quote=引用 11 楼 weidu23 的回复:] [quote=引用 5 楼 qq690388648 的回复:] 嗯,目测你本机ip是192.168.6.196。 因此应该编写另外一个服务端程序,监听本机ip,然后先运行那个程序,再运行本程序。
我初学,不懂 ? 书上就这个代码啊,然后直接测试,书上说代码通过了,还写了结果 。 可是我自己,无论是那书上的源代码,还是自己改编的代码,都抱错,都是Connection refused:connect![/quote]书上应该是有两段代码的,只有先运行服务器上那部分代码,再运行客户端上那部分代码,才能成功的……[/quote] 这些代码在书上的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。 所以 ....... --------------- 回到刚才的问题,求科普,求解!
西电小楠 2013-11-04
  • 打赏
  • 举报
回复
引用 11 楼 weidu23 的回复:
[quote=引用 5 楼 qq690388648 的回复:] 嗯,目测你本机ip是192.168.6.196。 因此应该编写另外一个服务端程序,监听本机ip,然后先运行那个程序,再运行本程序。
我初学,不懂 ? 书上就这个代码啊,然后直接测试,书上说代码通过了,还写了结果 。 可是我自己,无论是那书上的源代码,还是自己改编的代码,都抱错,都是Connection refused:connect![/quote]建议楼主先把理论学一下,再开始写代码吧,理论是铺垫啊……
西电小楠 2013-11-04
  • 打赏
  • 举报
回复
引用 11 楼 weidu23 的回复:
[quote=引用 5 楼 qq690388648 的回复:] 嗯,目测你本机ip是192.168.6.196。 因此应该编写另外一个服务端程序,监听本机ip,然后先运行那个程序,再运行本程序。
我初学,不懂 ? 书上就这个代码啊,然后直接测试,书上说代码通过了,还写了结果 。 可是我自己,无论是那书上的源代码,还是自己改编的代码,都抱错,都是Connection refused:connect![/quote]书上应该是有两段代码的,只有先运行服务器上那部分代码,再运行客户端上那部分代码,才能成功的……
sliwey 2013-11-04
  • 打赏
  • 举报
回复
把客户端和服务端的代码都运行起来 这样才能连通
weidu23 2013-11-04
  • 打赏
  • 举报
回复
引用 5 楼 qq690388648 的回复:
嗯,目测你本机ip是192.168.6.196。 因此应该编写另外一个服务端程序,监听本机ip,然后先运行那个程序,再运行本程序。
我初学,不懂 ? 书上就这个代码啊,然后直接测试,书上说代码通过了,还写了结果 。 可是我自己,无论是那书上的源代码,还是自己改编的代码,都抱错,都是Connection refused:connect!
weidu23 2013-11-04
  • 打赏
  • 举报
回复
引用 8 楼 u011325635 的回复:
再补一句,如果是端口占用了不是报那个错误,是这个: 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)
没有报这个JVM_Bind错误 ! 这个是端口占用错误,没报 。 问题,报的错误在我 new Socket(server,port)这里就错了!!! 求指教 ?
weidu23 2013-11-04
  • 打赏
  • 举报
回复
引用 4 楼 oh_Maxy 的回复:
socket都是成对出现的,而且启动顺序是先启动服务端代码(ServerSocket说:我在这儿等着你到来),然后启动客户端代码(Socket:留下来~)。 仔细看看书,应该还有个ServerSocket的实例的。
没有啊 ! 我看书上,只有TCPEchoClient.java这个代码,就可以直接运行了,可是我自己写的就是不行。 这是书上源代码,你看看:
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
  }
}
源代码里面,就是TCPEchoClient.java里面直接写了个main函数,然后测试。 书上的测试如下:java TCPEchoClient 192.0.2.1 "Echo this" 然后书上说结果是:Received:Echo this! -------------- 但是,我按照书上的测试,确保错,错误为Exception in thread "main" java.net.ConnectException: Connection refused: connect。 所以我很纠结了 。 mao哥,求指教下,我真心的不会了 !!!
小行星0906 2013-10-16
  • 打赏
  • 举报
回复
再补一句,如果是端口占用了不是报那个错误,是这个: 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)
小行星0906 2013-10-16
  • 打赏
  • 举报
回复
自己改下对应的端口号 猜测应该是80,常用WEB端口号
String[] args = { "192.168.6.196", "i love you ", "80" };
自己配置的端口号推荐3000以后的端口,比较可靠不容易占用 具体查阅的话,可以找服务那边的
ServerSocket serverSocket = new ServerSocket(5000);
这样一句,括号里面的代表服务器的端口号
鸿蒙道尊 2013-10-15
  • 打赏
  • 举报
回复
不知道服务,连不上服务,看一下端口是否有问题,
西电小楠 2013-10-15
  • 打赏
  • 举报
回复
嗯,目测你本机ip是192.168.6.196。 因此应该编写另外一个服务端程序,监听本机ip,然后先运行那个程序,再运行本程序。
oh_Maxy 2013-10-15
  • 打赏
  • 举报
回复
socket都是成对出现的,而且启动顺序是先启动服务端代码(ServerSocket说:我在这儿等着你到来),然后启动客户端代码(Socket:留下来~)。 仔细看看书,应该还有个ServerSocket的实例的。
wang530279 2013-10-15
  • 打赏
  • 举报
回复
你的服务器端代码呢?刚才说错了,不好意思
wang530279 2013-10-15
  • 打赏
  • 举报
回复
你的客户端的代码呢?
无聊找乐 2013-10-15
  • 打赏
  • 举报
回复
没有server当然连不上。

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧