黑马程序员技术交流社区

标题: Socket学习的问题 [打印本页]

作者: 曹昌豪    时间: 2012-6-1 10:15
标题: Socket学习的问题
习Socket的时候,用自己的电脑写的Socket和ServerSicket可以发送和接收消息吗
一运行就会抛ConnectException,该怎么解决呢
作者: 黑马—陈磊    时间: 2012-6-1 11:12
该异常发生在客户端进行new Socket(ip, port)操作时,该异常发生的原因是或者具有ip地址的机器不能找到,或者是该ip存在,但找不到指定的端口进行监听。出现该问题,首先检查客户端的ip和port是否写错了,如果正确则从客户端ping一下服务器看是否能ping通,如果能ping通(服务服务器端把ping禁掉则需要另外的办法),则看在服务器端的监听指定端口的程序是否启动。

贴一个我收藏的Socket编程简单例子:
注释: Socket-->亦称作"套接字",是java网络编程基础,用来描叙IP地址和端口。
        Socket:建立网络连接时使用.
        ServerSocket:用于服务器端.

   [一个简单的单线程的"Client-Server"例子]
    Server(服务器端):使用ServerSocket监听指定的端口,等待客户连接请求,客户连接后,会话产生.
    Client(客户端):使用Socket对服务器的端口发出连接请求,一旦连接成功,打开会话.

***********************Server********************
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server{
       public static void main(String []args){
                try{
                       ServerSocket ss = new ServerSocket(8099);
                       System.out.println("服务器已启动,等到客户端的连接...");
                       Socket socket = ss.accept();// -->服务器收到客户端的数据后,创建与此客户端对话的Socket  
                       DataInputStream in=new DataInputStream(socket.getInputStream());
                     // -->用于接收客户端 发来的数据的输入流
                      System.out.println("服务器接受到客户端的连接请求:"+in.readUTF());
                      DataOutputStream out = new DataOutputStream(socket.getOutputStream());
                      out.writeUTF("接受连接请求,连接成功");
                      socket.close();
                      ss.close();
                  }catch(Exception e){
                           e.printStackTrace(); }
              }
        }

*************************Client******************************
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
public class Client{
             public static void main(String []args){
                    try{
                         Socket socket = new Socket("localhost",8099);
                         DataOutputStream out = new DataOutputStream(socket.getOutputStream());
                         out.writeUTF("客户端请求服务器的连接...");
                         DataInputStream in = new DataInputStream(socket.getInputStream());  
                         System.out.println(in.readUTF()); socket.close();
                    }catch(Exception e){
                           e.printStackTrace();
                 }
         }
     } //注释:8099-->自定义端口,最好大于1024均可
作者: 刘伯阳    时间: 2012-6-1 11:31
是可以的,但是要注意以下几点:
1、Socket(ip,port)   这个ip必须填写本机ip(127.0.0.1) port必须没有被使用(一般前1024留给系统使用)
2、ServerSocket(port)  port必须与Socket的端口一致
3、必须先运行服务器端(Server)再运行客户端(Client),没有服务器,客户端找谁连接呢?
作者: 黑马11期李项京    时间: 2012-6-1 12:31
操作方法:启动两个命令行窗口或者两个eclipse窗口,先运行服务器类,再运行客户端类。具体代码如下
/*

演示TCP传输
1、TCP分客户端和服务端
2、客户端对应的对象是Socket
        服务端对应的对象是ServerSocket
*/

/*
客户端
通过查阅Socket对象,发现在该对象建立时,就可以连接指定主机
因为TCP是面向连接的,所以在建立Socket服务时,就要有服务端存在,并连接成功,形成通路后,在该通道进行数据的传输

步骤:
1、创建Socket服务,并指定要连接的主机和端口

*/
import java.io.*;
import java.net.*;
class  TCPClient
{
        public static void main(String[] args) throws Exception
        {
                //创建客户端的Socket服务,指定目的主机和端口
                Socket s=new Socket("",1002);
                //为了发送数据,应该获取socket流中的输出流
                OutputStream out=s.getOutputStream();
                out.write("TCP ge men lai le ".getBytes());
                s.close();
        }
}
/*
需求:定义端点接收数据并打印在控制台上
服务端:
1、建立服务端的Socket服务,ServerSocket();
        并监听一个端口
2、获取连接过来的客服端对象
        通过ServerSocket的accept方法,没有连接就会等,所以这个方法阻塞式的
3、客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据
        并打印在控制台
        4、关闭服务端(可关可不关)
*/
class TCPServer
{
        public static void main(String[] args)throws Exception
        {
                //建立服务端Socket服务,并监听一个端口。
                ServerSocket ss=new ServerSocket(1002);
                //通过accept方法获取连接过来的客户端对象
                Socket s=ss.accept();
                String ip=s.getInetAddress().getHostAddress();
                System.out.println(ip+"....connected");
                //获取客户端发送过来的数据,那么要使用客户端对象的读取来读取数据
                InputStream in=s.getInputStream();

                byte[] buf=new byte[1024];
                int len=in.read(buf);
                System.out.println(new String(buf,0,len));
                s.close();//关闭客户端
                ss.close();
        }
}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2