【学习日记】java网络编程知识点总结

来源:互联网 发布:pscc是什么软件 编辑:程序博客网 时间:2024/05/16 10:12
网络模型:OSI参考模型、 TCP/IP模型

OSI:应用层 表示层 会话层 传输层 网络层 数据链路层 物理层

TCP/IP:应用层 传输层 网际层 主机至网络层

常用协议

传输层TCP UDP
网际层 IP
应用层 HTTP FTP

网络通信要素:IP 地址、端口号、通讯协议

IP地址:网络设备的标识

端口号:为了区分计算机里面的应用程序而为每一个应用程序的标识
通讯协议:定义通信规则

TCP/UDP区别

UDP
1 将数据源和目的地封装成数据包中
2 不需要建立连接
3 每个数据报的大小限制在64KB
4 因无连接,是不可靠的协议
5 不需要简历连接,速度快
TCP
1 建立连接,形参传输数据的通道
2 在连接中进行大数据量传输
3 通过三次握手完成连接
4 是可靠协议
5 必须建立连接,效率会稍低
Socket

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

UDP协议传输
  编写一个聊天程序。有收数据的部分,和发数据的部分。这两部分需要同时执行。那就需要用到多线程技术。一个线程控制收,一个线程控制发。因为收和发动作是不一致的,所以要定义两个run方法。而且这两个方法要封装到不同的类中。
代码如下

package testimport java.io.*;import java.net.*;/**  * @author wangkun  */class Send implements Runnable{    //建立套件字    private DatagramSocket ds;    public Send(DatagramSocket ds)    {        this.ds = ds;    }    //重写run()方法    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{    //建立UDPsocket断点    private DatagramSocket ds;    public Rece(DatagramSocket ds)    {        this.ds = ds;    }    public void run()    {        try        {            while(true)            {                byte[] buf = new byte[1024];                //定义数据包DP                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  test5{    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();    }}

TCP协议传输

1,tcp分客户端和服务端。
2,客户端对应的对象是Socket;服务端对应的对象是ServerSocket。

TCP 传输
客户端

package testimport java.io.*;import java.net.*;class  ClientDemo{    public static void main(String[] args) throws Exception     {        //建立客户端的socket         Socket s = new Socket("192.168.1.210",10002);        //获取socket流中的输出流发送数据        OutputStream out = s.getOutputStream();        out.write("asdasd".getBytes());        s.close();    }}

服务端

class  ServerDemo{    public static void main(String[] args) throws Exception    {        //建立服务端socket服务,监听一个端口。        ServerSocket ss = new ServerSocket(10002);        while(true)        {        //通过accept接收客户端Socket        Socket s = ss.accept();        String ip = s.getInetAddress().getHostAddress();        //sop(ip+":connected");        //使用客户端对象的读取流来获取客户端socket发送过来的数据         InputStream in = s.getInputStream();        byte[] buf = new byte[1024];        int len = in.read(buf);         sop(new String(buf,0,len));        s.close();//关闭客户端.        }        //关闭服务端socket        //ss.close();    }}

TCP的传输的客户端和服务端的互访
需求:客户端给服务端发送数据,服务端收到后,给客户端反馈信息。

客户端
思路:
1,建立socket服务。指定要连接主机和端口。
2,获取socket流中的输出流。将数据写到该流中。通过网络发送给服务端。
3,获取socket流中的输入流,将服务端反馈的数据获取到,并打印。
4,关闭客户端资源。
class ClientDemo2 {    public static void main(String[] args)throws Exception     {        //建立socket服务        Socket s = new Socket("192.168.1.210",10002);        //获取socket流中的输出流。将数据写到该流中。通过网络发送给服务端。        OutputStream out = s.getOutputStream();        out.write("服务端是否收到".getBytes());        //获取socket流中的输入流,将服务端反馈的数据获取到,并打印。        InputStream in = s.getInputStream();        byte[] buf = new byte[1024];        int len = in.read(buf);        sop(new String(buf,0,len));        s.close();    }}

服务端

class ServerDemo2{    public static void main(String[] args) throws Exception    {        //建立服务端socket服务        ServerSocket ss = new ServerSocket(10002);        ////通过accept方法获取客户端对象        Socket s = ss.accept();        String ip = s.getInetAddress().getHostAddress();        sop(ip+":connected");        //使用客户端对象的读取流来获取客户端socket发送过来的数据        InputStream in = s.getInputStream();        byte[] buf = new byte[1024];        int len = in.read(buf);        sop(new String(buf,0,len));        OutputStream out = s.getOutputStream();        Thread.sleep(10000);        out.write("已收到".getBytes());        s.close();        ss.close();    }}
0 0
原创粉丝点击