黑马程序员—网络编程

------- android培训java培训、期待与您交流! ----------

网络编程:

Socket

就是为网络服务提供的一种机制,通信的两端都有Socket,网络通信其实就是Socket间的通信,数据在两个Socket间通过IO传输。

UDP传输:

1,只要是网络传输,必须有socket 。

2,数据一定要封装到数据包中,数据包中包括目的地址、端口、数据等信息。

直接操作udp不可能,对于java语言应该将udp封装成对象,易于我们的使用,这个对象就是DatagramSocket. 封装了udp传输协议的socket对象。

因为数据包中包含的信息较多,为了操作这些信息方便,也一样会将其封装成对象。这个数据包对象就是:DatagramPacket.通过这个对象中的方法,就可以获取到数据包中的各种信息。

DatagramSocket具备发送和接受功能,在进行udp传输时,需要明确一个是发送端,一个是接收端。

udp的发送端:

1,建立udp的socket服务,创建对象时如果没有明确端口,系统会自动分配一个未被使用的端口。

2,明确要发送的具体数据。

3,将数据封装成了数据包。

4,用socket服务的send方法将数据包发送出去。

5,关闭资源。


 

1:获取网络中的主机域名和ip地址

   

 try{
//     InetAddress ia=InetAddress.getByName("Lenovo");
       InetAddressia=InetAddress.getByName("192.168.1.2");
//    InetAddressia=InetAddress.getLocalHost();
       System.out.println(ia.getHostName());
       System.out.println(ia.toString());
    } catch(UnknownHostException e) {
       // TODOAuto-generated catch block
       e.printStackTrace();
    }

 

                        

                                1.ServerSocket:服务器类

               TCP通信

                                2.Socket:客户端类

二:网络编程类

                               1.DatagramSocket

               UDP通信

                              2. DatagramPacket

 

 

 

三:ServerSocket类

  1:ServerSocket类用来表示服务器套接字。服务器套接字通过指定的端口来等待连接的套接字,他的主要功能是等待来自网络上的连接“请求”。服务器套接字一次可以与一个套接字连接,如果多台客户机同时提出连接请求,服务器套接字会将请求连接的客户机存入队列中,然后从中取出一个套接字,与服务器新建的套接字连接起来,如果请求连接数大于最大容纳数,则多出的请求被拒绝。队列的默认大小为50.

2:ServerSocket类的构造方法:

ServerSocket()
          创建非绑定服务器套接字。

ServerSocket(int port)
          
创建绑定到特定端口的服务器套接字。

ServerSocket(int port, int backlog)
         port:  创建绑定到特定端口的服务器套接字 。

         Backlog:指定队列的最大长度。

3:

方法摘要

 Socket

accept()
          
侦听并接受到此套接字的连接。

 void

bind(SocketAddress endpoint)
          将 ServerSocket 绑定到特定地址(IP 地址和端口号)。

 void

bind(SocketAddress endpoint, int backlog)
          将 ServerSocket 绑定到特定地址(IP 地址和端口号)。

 void

close()
          关闭此套接字。

 InetAddress

getInetAddress()
          返回此服务器套接字的本地地址。

 int

getLocalPort()
          返回此套接字在其上侦听的端口。

 boolean

isBound()
          返回 ServerSocket 的绑定状态。

 boolean

isClosed()
          返回 ServerSocket 的关闭状态。

 String

toString()
          作为 String 返回此套接字的实现地址和实现端口。

 

4:调用ServerSocket类的accept()方法会返回一个和客户端Socket对象连接的Socket对象。

5:服务器端的Socket对象使用getOutputStream()方法获得的输出流将指向客户端Socket对象使用getInputStream()方法获得的那个输入流。反之也成立。

也就是说:当服务器端向输出流写入信息时,客户端通过相应的输入流就能读取;反之也成立。

6:创建一个服务器套接字:

   

 public static voidmain(String[] args) {
        // TODOAuto-generated method stub
    try {
        ServerSockets=newServerSocket(9999);
        System.out.println("成功创建服务器套接字");
        while(true){
            System.out.println("等待客户端的连接...");
            Socketso=s.accept();
            System.out.println("与客户端建立连接");
        }
    } catch(IOException e) {
        // TODOAuto-generated catch block
        e.printStackTrace();
    }
    }

四:Socket类

1:Socket类是套接字类。使用Socket类时需要制定待连接的服务器的ip和端口号。服务器套接字与客户端套接字连接成功后,则可以获取套接字的输入输出流,进行数据交换。

2:构造方法:

构造方法摘要

 

Socket()
          通过系统默认类型的 SocketImpl 创建未连接套接字

 

Socket(InetAddress address, int port)
          创建一个流套接字并将其连接到指定 IP 地址的指定端口号。

 

Socket(String host, int port)
          
创建一个流套接字并将其连接到指定主机上的指定端口号。

 

Socket(String host, int port, InetAddress localAddr, int localPort)
          创建一个套接字并将其连接到指定远程主机上的指定远程端口。

host用于指定服务器的ip地址,port是连接服务器的端口号。

五:例:客户端和服务器端的连接:

  1:服务器端:

public classHelloServer {
     //可以使用telnet进行测试:open localhost 9999
    public static voidmain(String[] args) throwsIOException {
    //实例化一个服务器端的socket连接
    ServerSocket ss=newServerSocket(9999);
     //用于向客户端打印输出
    PrintWriter out=null;
     //实例化一个客户端对象,用于接收客户端的连接
    Socket cs=null;
    System.out.println("等待客户端连接...");
     //通过ServerSocket类中的accept()方法,
     //接收客户端的请求,此方法返回一个客户端的Socket请求
    cs=ss.accept();
     //out就具备了向cs打印的功能
    out=newPrintWriter(cs.getOutputStream(),true);
    out.println("Hello world");
    cs.close();
    ss.close();
    }
}
客户端:
public classHelloClient {
    public static voidmain(String[] args) throwsUnknownHostException, IOException {
        //实例化一个Socket对象,在本机的9999端口进行监听
        Socketcs=new Socket("localhost",9999);
        //次对象用于读取服务器端发送过来的数据
        BufferedReaderin=null;
       //用来将输入输出流与socket关联
        //getInputStream()返回此对象的输入流;然后把输入流转化为字符流
  in=newBufferedReader(newInputStreamReader(cs.getInputStream()));
        System.out.println(in.readLine());
        in.close();
        cs.close();
    }
}


 


客户端:

import java.io.*;
import java.net.*;
// 客户端程序
publicclass EchoClient
{
    public static void main(String[] args)throws IOException
    { 
        Socket echoSocket = null;
        PrintWriter out = null;
           BufferedReaderin = null;
        try
        {
            echoSocket = new Socket ("localhost", 1111);
            out = newPrintWriter(echoSocket.getOutputStream(), true);
            in = new BufferedReader(
                 newInputStreamReader(echoSocket.getInputStream()));
        }
        catch (UnknownHostException e)
        {
            System.err.println("Don't knowabout host: localhost.");
            System.exit(1);
        }
       System.out.println(in.readLine());
       System.out.println(in.readLine());
       BufferedReader stdIn =
new BufferedReader(newInputStreamReader(System.in));
       String userInput;
       // 将客户端Socket输入流输出到标准输出
       while ((userInput = stdIn.readLine()) !=null)
       {
           out.println(userInput);
           System.out.println(in.readLine());
       }
       out.close();
       in.close();
       echoSocket.close();
    }
}


 

 

 

 

------- android培训java培训、期待与您交流! ----------详细请查看:http://edu.csdn.net

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
黑马程序员是一家IT培训机构,提供各种技术培训课程,包括网络通信相关的课程。在网络通信中,socket是一种编程接口,用于实现不同主机之间的通信。通过socket函数创建一个套接字,指定域名、类型和协议。域名可以是AF_INET、AF_INET6或AF_UNIX,类型可以是SOCK_STREAM(用于TCP通信)或SOCK_DGRAM(用于UDP通信),协议可以是0表示自动选择适合的协议。创建成功后,套接字会返回一个文件描述符,用于在后续的通信中进行读写操作。 在TCP通信中,服务器和客户端的流程大致相同。服务器首先使用socket函数创建套接字,然后使用bind函数绑定服务器地址结构,接着使用listen函数设置监听上限。服务器通过accept函数阻塞监听客户端连接,并使用read函数读取客户端传来的数据,进行相应的处理后,使用write函数将处理后的数据写回给客户端,最后使用close函数关闭套接字。客户端也是先使用socket函数创建套接字,然后使用connect函数与服务器建立连接,之后使用write函数将数据写入套接字,再使用read函数读取服务器返回的数据,最后使用close函数关闭套接字。 在UDP通信中,服务器和客户端的流程也有所不同。服务器使用socket函数创建套接字,指定类型为SOCK_DGRAM,然后使用bind函数绑定服务器地址结构。服务器通过recvfrom函数接收客户端传来的数据,并进行相应的处理,最后使用sendto函数将处理后的数据发送回给客户端。客户端同样使用socket函数创建套接字,然后通过sendto函数将数据发送给服务器,再使用recvfrom函数接收服务器返回的数据。 总之,socket网络通信是通过创建套接字实现不同主机之间的通信。根据使用的协议不同,可以选择TCP或UDP通信方式。服务器和客户端根据流程进行相应的操作,实现数据的传输和交互。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值