黑马程序员_网络编程1

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




1.UDP相关类:

1) DatagramSocket:

构造器:DatagramSocket() 构造数据报套接字并将其绑定到本地主机上任何可用的端口。

DatagramSocket(int port) 创建数据报套接字并将其绑定到本地主机上的指定端口。

一般常用这两个构造方法。

基本方法:void setSoTimeout(int timeout) 启用/禁用带有指定超时值的 SO_TIMEOUT,以毫秒为单位。 

void receive(DatagramPacket p) 从此套接字接收数据报包。 

void send(DatagramPacket p) 从此套接字发送数据报包。 

(2)DatagramPacket

基本构造器:

DatagramPacket(byte[] buf, int length) 

           构造 DatagramPacket,用来接收长度为 length 的数据包。 

DatagramPacket(byte[] buf, int length, InetAddress address, int port) 

          构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。

基本方法:

 InetAddress getAddress()    此数据报将要发往该机器或者是从该机器接收到的IP。 

 byte[] getData()            返回数据缓冲区。 

 int getLength()             返回将要发送或接收到的数据的长度。  

 int getPort()               此数据报将要发往该主机或者是从该主机接收到的端口号。 

 void setAddress(InetAddress iaddr)   设置要将此数据报发往的那台机器的 IP 地址。 

 void setData(byte[] buf)    为此包设置数据缓冲区。 

 void setData(byte[] buf, int offset, int length)   为此包设置数据缓冲区。 

 void setLength(int length)  为此包设置长度。 

 void setPort(int iport)   设置要将此数据报发往的远程主机上的端口号。  

2.InetAddress类基本应用:

        InetAddress ia = InetAddress.getLocalHost();

System.out.println(ia.getHostAddress());

System.out.println(ia.getHostName());

InetAddress ia2 = InetAddress.getByName("10.21.51.25");

System.out.println(ia2.getHostAddress());

        // 若由IP解析不成功,则返回IP地址           

        System.out.println(ia2.getHostName());

3.UDP发送接收基本程序:

  发送端:

       class  UdpSend{

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

DatagramSocket ds = new DatagramSocket(8888);

byte[] buf = "udp ge men lai le ".getBytes();

DatagramPacket dp = New DatagramPacket(buf,buf.length,

                 InetAddress.getByName("192.168.1.254"),10000);

ds.send(dp);

ds.close(); }}

 接收端:

        class  UdpRece{

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

          DatagramSocket ds = new DatagramSocket(10000);

       while(true){

           byte[] buf = new byte[1024];

       DatagramPacket dp = new DatagramPacket(buf,buf.length);

              ds.receive(dp);//阻塞式方法。

            String ip = dp.getAddress().getHostAddress();

      String data = new String(dp.getData(),0,dp.getLength());

             int port = dp.getPort();

             System.out.println(ip+"::"+data+"::"+port);}

ds.close(); }}

4.UDP 聊天小应用:

/*

编写一个聊天程序。

有收数据的部分,和发数据的部分。

这两部分需要同时执行。

那就需要用到多线程技术。

一个线程控制收,一个线程控制发。

因为收和发动作是不一致的,所以要定义两个run方法。

而且这两个方法要封装到不同的类中。

第二次运行要修改端口

*/

import java.io.*;

import java.net.*;

class Send implements Runnable{

private DatagramSocket ds;

public Send(DatagramSocket ds){

this.ds = ds;}

public void run(){

try{

BufferedReader bufr = 

                new BufferedReader(new InputStreamReader(System.in));

String line = null;

while((line=bufr.readLine())!=null){

     byte[] buf = line.getBytes();

DatagramPacket dp =  new DatagramPacket(buf,

          buf.length,InetAddress.getByName("192.168.1.255"),10002);

ds.send(dp);

if("886".equals(line))

break;}

}catch (Exception e){

throw new RuntimeException("发送端失败");}}}

class Rece implements Runnable{

private DatagramSocket ds;

public Rece(DatagramSocket ds){

this.ds = ds;}

public void run(){

try{

while(true){

byte[] buf = new byte[1024];

DatagramPacket dp =

                           new DatagramPacket(buf,buf.length);

ds.receive(dp);

String ip = dp.getAddress().getHostAddress();

String data = 

                           new String(dp.getData(),0,dp.getLength());

if("886".equals(data)){

System.out.println(ip+"....离开聊天室");

break;}

System.out.println(ip+":"+data);}}

catch (Exception e){

throw new RuntimeException("接收端失败");}}}

public class  ChatDemo{

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

DatagramSocket sendSocket = new DatagramSocket();

DatagramSocket receSocket = new DatagramSocket(10002);

new Thread(new Send(sendSocket)).start();

new Thread(new Rece(receSocket)).start();}}

5.TCP相关类:

1SocketAddress类无方法,只有无参构造器。他的子类InetSocketAddress封装了IP 地址 端口号,它还可以是一个对(主机名 端口号),在此情况下,将尝试解析主机名。如果解析失败,则该地址将被视为未解析地址。

InetSocketAddress类:

全部构造器:

InetSocketAddress(InetAddress addr, int port)      根据 IP 地址和端口号创建套接字地址。 

InetSocketAddress(int port)  创建套接字地址,其中 IP 地址为通配符地址,端口号为指定值。 

InetSocketAddress(String hostname, int port)  根据主机名和端口号创建套接字地址。

常用方法:

 boolean equals(Object obj)    将此对象与指定对象比较。 

 InetAddress getAddress()     获取 InetAddress。 

 String getHostName()        获取 hostname。 

 int getPort()                获取端口号。 

 int hashCode()             返回此套接字地址的哈希码。 

 String toString()            构造此 InetSocketAddress 的字符串表示形式。 

2)客户端Socket

常用构造器:

Socket()可以通过 connect(SocketAddress endpoint)将此套接字连接到服务器。

Socket(InetAddress address, int port) 

          创建一个流套接字并将其连接到指定 IP 地址的指定端口号。 

Socket(String host, int port) 

          创建一个流套接字并将其连接到指定主机上的指定端口号。

常用方法:

 void close()                       关闭此套接字。 

 InputStream getInputStream()    返回此套接字的输入流 

 OutputStream getOutputStream()  返回此套接字的输出流。 

 InetAddress getLocalAddress()   获取套接字绑定的本地地址。 

 int getLocalPort()                返回此套接字绑定到的本地端口。 

 InetAddress getInetAddress()    返回套接字连接的地址。 

 int getPort()                      返回此套接字连接到的远程端口。 

 void setSoTimeout(int timeout) 

         启用/禁用带有指定超时值的 SO_TIMEOUT,以毫秒为单位。 

 void shutdownInput()             此套接字的输入流置于“流的末尾”。 

 void shutdownOutput()      关闭此套接字的输出流,并向对方发送关闭信息。 

 String toString()           将此套接字转换为 String

3)服务端:ServerSocket

常用构造器:

ServerSocket(int port, int backlog) 

                Backlog 同时连接到服务器的客户端最大数。

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

常用方法:

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

void close()          关闭此套接字

4)简单示例:

客户端:

       public class TCPTestClient {

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

     Socket s=new Socket("10.21.51.20", 10009);

     OutputStream os=s.getOutputStream();

     os.write("ge men wo lai le".getBytes());

     os.flush();

     s.close();}}

服务器端:

     public class TCPTestServer {

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

   ServerSocket ss=new ServerSocket(10009);

   Socket s=ss.accept();

   InputStream is=s.getInputStream();

   byte[] buf=new byte[1024];

   int len=is.read(buf);

   System.out.println(new String(buf,0,len));

   s.close();

   ss.close();}}

6.URL类:

常用构造器:URL(String spec)    根据 String 表示形式创建 URL 对象

常用方法:

 String getFile()       获取此 URL 的文件名。 

 String getHost()       获取此 URL 的主机名(如果适用)。 

 String getPath()       获取此 URL 的路径部分。 

 int getPort()           获取此 URL 的端口号。 

 String getProtocol()  获取此 URL 的协议名称。 

 String getQuery()      获取此 URL 的查询部 

 URLConnection openConnection() 

          返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接。

 InputStream openStream()   相当于openConnection().getInputStream()。

         

示例:

URL url =

new  URL("http://192.168.1.254/myweb/demo.html?name=haha&age=30");

System.out.println("getProtocol() :"+url.getProtocol());

System.out.println("getHost() :"+url.getHost());

System.out.println("getPort() :"+url.getPort());

System.out.println("getPath() :"+url.getPath());

System.out.println("getFile() :"+url.getFile());

System.out.println("getQuery() :"+url.getQuery());

输出:

getProtocol() :http

getHost() :192.168.1.254

getPort() :-1

getPath() :/myweb/demo.html

getFile() :/myweb/demo.html?name=haha&age=30

getQuery() :name=haha&age=30

7.类URLConnection代表应用程序和 URL 之间的通信链接。此类的实例可用于读取和写入此 URL 引用的资源。

构造器:protected  URLConnection(URL url)  构造一个到指定URL的未创建的连接。

常用方法:

abstract  void connect()  打开到此URL引用的资源的通信链接(如果尚未建立这样的连接)。 

InputStream getInputStream()     返回从此打开的连接读取的输入流。 

OutputStream getOutputStream()  返回写入到此连接的输出流。 

URL getURL()                返回此 URLConnection 的 URL 字段的值。 

String toString()               返回此 URL 连接的 String 表示形式。

示例: 

  URL url = new URL("http://192.168.1.254:8080/myweb/demo.html");

  URLConnection conn = url.openConnection();

  System.out.println(conn);

  InputStream in = conn.getInputStream();

  byte[] buf = new byte[1024];

  int len = in.read(buf);

  System.out.println(new String(buf,0,len));

8.本机DNS映射配置文件位置:C:\WINDOWS\system32\drivers\etc\hosts



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

详细请查看:http://edu.csdn.net/heima

  • 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、付费专栏及课程。

余额充值