黑马程序员_JAVA学习日记_JAVA中网络编程

来源:互联网 发布:画中字软件 编辑:程序博客网 时间:2024/05/17 04:16

 黑马程序员-学习日记

 

黑马程序员_JAVA学习日记_JAVA中网络编程

 

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

 

一:网络编程:

UDP:面向无连接,不可靠,速度快。相当于步话机。

TCP:面向连接,可靠,速度相对慢。相当于打电话。

udp发送端的思路:

1,建立udp的socket服务。

2,将要发送的数据封装成数据包。

3,通过udp的socket服务,将数据包发送取出。

4,建议关闭资源。

 

import java.net.*;

class SendDemo

{

public static void main(String[] args) throwsException

{

//1,建立udp服务。

DatagramSocket ds = new DatagramSocket();//发送端并没有指定端口,那么会自动分配一个端口。

//2,定义数据内容,并将数据封装成数据包。

byte[] buf = "udp 哥们 来了".getBytes();

 

DatagramPacket dp =

newDatagramPacket(buf,buf.length,InetAddress.getByName("192.168.54.9"),10000);

 

//3,通过udp的socket服务中的功能,完成数据包的发送。

ds.send(dp);

 

//4,关闭资源。

ds.close();

}

}

 

二:udp的接收端:

思路:

1,建立udpsocket服务。需要该应用程序定义数字标识,也就是端口,

       也就是说:让该应用程序监听一个端口,只要是给这个端口发送的数据,

       该应用程序就可以进行处理。

 

2,通过receive方法接收数据。

3,将收到的数据存储到数据包对象中。

4,通过数据包对象的功能来完成对接收到的数据进行解析。

5,可以对资源进行关闭。

 

class  ReceDemo

{

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

       {

 

              //1,定义socket服务,并监听一个端口,明确哪些是是该应用程序可以处理的。

              DatagramSocket ds = newDatagramSocket(10000);

              while(true)

              {

              //2,预先定义好一个数据包。用于存储接收到的数据。

              //因为数据包中必须有一个容器存储这些数据。所以要先定义字节数组。

              byte[] buf = new byte[1024];

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

 

              //3,使用socket服务的receive方法将接收到的数据,存储到数据包中。

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

 

              //4,通过数据包对象的方法获取其中的数据内容。包括,地址,端口,数据主体。

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

              int port = dp.getPort();

 

              String text = newString(dp.getData(),0,dp.getLength());

 

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

              }

              //5,关闭资源。

              //ds.close();

 

       }

}

 

三:TCP:面向连接,可靠的协议。

客户端和服务端。

客户端:Socket

服务端:ServerSocket

 

客户端建立思路:

1,建立客户端的socket服务。并明确要连接的服务端。

       因为只有建立了连接,才可以进行通讯。

2,如果连接建立成功,就表明,已经了数据传输的通道。就可以在该通道通过IO进行数据的读取和写入。

       该通道称为socket流,socket流中既有读取流,也有写入流。

3,通过socket对象的方法。可以获取这两个流对象。

4,通过流对象就可以对数据进行传输。

5,如果传输数据完毕,关闭资源。

 

import java.io.*;

import java.net.*;

 

//通过客户端给服务端写数据。

class  ClientDemo

{

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

       {

              //1,建立客户端socket服务。并去进行目的地址的连接。

              Socket s = newSocket("192.168.54.9",10002);

 

              //2,通过socket对象的方法getOutputStream获取输出流对象。

              OutputStream out =s.getOutputStream();

 

              //3,将数据写入流中。

              out.write("TCP 哥们 又来了".getBytes());

 

              //4,关闭资源

              s.close();

       }

}

 

 

四:建立服务端的思路:

1,建立服务端的socket服务。分配一个端口,用于监听该端口收到的数据。

2,服务端没有直接流的操作,而是通过accept方法获取客户端对象,

       在通过获取到的客户端对象的流和客户端进行通讯。

3,通过客户端的获取流对象的方法,读取数据或者写入数据。

4,如果服务完成,需要关闭客户端,然后关闭服务端。

       但是一般会关闭客户端,不关闭服务端,因为服务端是一值提供服务的。

 

class  ServerDemo

{

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

       {

              //1, 建立服务端对象,监听一个端口。

              ServerSocket ss = newServerSocket(10002);

 

              //2,通过accept方法获取客户端对象。

              Socket s = ss.accept();//该方法是阻塞式的。

             

              String ip =s.getInetAddress().getHostAddress();

              System.out.println(ip+".....connected");

 

              //3,获取socket的读取流,读取客户端发送过来的数据。

              InputStream in =s.getInputStream();

 

              //4,就是读取数据的基本操作。

              byte[] buf  = new byte[1024];

              int len = in.read(buf);

 

              String text = newString(buf,0,len);

 

              System.out.println(text);

 

              s.close();

              ss.close();

       }

}

 

五:TCP:面向连接,可靠的协议。

客户端和服务端。

客户端:Socket

服务端:ServerSocket

 

import java.io.*;

import java.net.*;

class  ClientDemo

{

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

       {

              Socket s = newSocket("192.168.54.9",10002);

 

              OutputStream out =s.getOutputStream();

 

              out.write("TCP 哥们 又来了".getBytes());

 

 

              InputStream in =s.getInputStream();

 

              byte[] buf = new byte[1024];

 

              int len = in.read(buf);

 

              String text = newString(buf,0,len);

 

              System.out.println("server:"+text);

 

              s.close();

       }

}

 

class  ServerDemo

{

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

       {

              ServerSocket ss = newServerSocket(10002);

 

              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);

 

              String text = newString(buf,0,len);

 

              System.out.println(text);

 

              OutputStream out =s.getOutputStream();

 

              out.write("哥们已收到".getBytes());

 

              s.close();

              ss.close();

       }

}

 

六:演示IP地址对象InetAddress的程序代码如下:

import java.net.*;

class  IPDemo

{

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

       {

 

              method_3();

             

       }

       public static void method_3()throwsException

       {

 

//           /static InetAddress[]getAllByName(String host) 获取一个主机对应的所有IP地址.

 

//           如何获取一台主机的ip地址呢?

              InetAddress ip =InetAddress.getByName("www.sina.com.cn");//没有连接成功,就会出现UnknownHostException

             

              String addr = ip.getHostAddress();

              String name = ip.getHostName();

 

              System.out.println("addr:"+addr);

              System.out.println("name:"+name);

       }

 

       public static void method_2() throwsException

       {

              InetAddress ip =InetAddress.getByName("192.168.54.12");

             

              String addr = ip.getHostAddress();

              String name = ip.getHostName();

 

              System.out.println("addr:"+addr);

              System.out.println("name:"+name);

 

       }

       public static void method_1() throwsException

       {

              InetAddress ip =InetAddress.getLocalHost();

 

              String addr = ip.getHostAddress();

              String name = ip.getHostName();

 

              System.out.println("addr:"+addr);

              System.out.println("name:"+name);

       }

}

 

import java.net.*;

import java.io.*;

 

七:通过键盘录入的方式来发送数据。

 

class SendDemo

{

public static voidmain(String[] args) throws Exception

{

       DatagramSocket ds = new DatagramSocket();//发送端并没有指定端口,那么会自动分配一个端口。

 

       BufferedReader bufr =

                     new BufferedReader(newInputStreamReader(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.54.127"),10000);

 

              ds.send(dp);

 

              if("886".equals(line))

                     break;

       }

 

       ds.close();

}

}

 

class  ReceDemo

{

public static voidmain(String[] args) throws Exception

{

 

       DatagramSocket ds = newDatagramSocket(10000);

       while(true)

       {

       byte[] buf = new byte[1024];

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

 

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

 

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

       int port = dp.getPort();

 

       String text = newString(dp.getData(),0,dp.getLength());

 

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

       }

       //ds.close();

}

}

 

import java.io.*;

import java.net.*;

 

class Receimplements Runnable

{

privateDatagramSocket ds;

Rece(DatagramSocketds)

{

       this.ds = ds;

}

public void run()

{

       try

       {

              while(true)

              {

                     byte[] buf = newbyte[1024];

 

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

 

                     ds.receive(dp);

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

                     int port = dp.getPort();

      

                     String text = newString(dp.getData(),0,dp.getLength());

                    

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

 

                     if(text.equals("886"))

                     {

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

                     }

              }

             

       }

       catch (Exception e)

       {

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

       }

      

}

}

 

class Sendimplements Runnable

{

privateDatagramSocket ds;

Send(DatagramSocketds)

{

       this.ds = ds;

}

public void run()

{

       try

       {

              BufferedReader bufr =

                            newBufferedReader(new InputStreamReader(System.in));

 

              String line = null;

 

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

              {

                     byte[] buf =line.getBytes();

                     DatagramPacket dp =

                            newDatagramPacket(buf,buf.length,InetAddress.getByName("192.168.54.127"),10001);

 

                     ds.send(dp);

 

                     if("886".equals(line))

                            break;

 

              }

              ds.close();

       }

       catch (Exception e)

       {

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

       }

}

}

 

class ChatDemo

{

public static voidmain(String[] args) throws Exception

{

       DatagramSocket sendSocket = newDatagramSocket();

       DatagramSocket receSocket = newDatagramSocket(10001);

 

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

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

 

}

}

 

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