Java学习笔记--网络编程Socket

**今天学习了网络编程,主要用到Socket语句。
1.首先了解网络编程三要素
a.ip:一个计算机的标识,是一个网络之间互联的协议(Internet Protocol),每个终端有且仅有一个ip地址。
b.端口:设备与外界进行通信的出口,用来进行通信,分为物理端口和逻辑端口,这里用到的端口是逻辑端口,
有效端口的范围在0~65535之间,是应用程序在计算机内部对应的表示。
c.协议:计算机网络中用于交换信息而规则,标准或约定的集合。这里指TCP/UDP。
2.TCP/UDP协议
TCP协议:是一种面向连接的,可靠的基于字节流的传输层通信协议,需要建立连接,形成连接通道,
数据可以使用连接通道直接进行传输,无大小限制,效率比较低
UDP协议:User Datagrem Protocol,用户数据包协议,一种无连接的传输层协议,和TCP协议相同用于处理数据包,
UDP有不提供数据包的分组,组装,还有对数据包进行排序的缺点,所以我们无法确定数据包是否被安全
传达。效率较TCP来说比较高,但是不安全。
3.学习中用到的Java类
InetAddress:IP地址描述类,为了方便我们对IP地址的获取和操作,常见功能有:
public static InerAddress getByName(String host);通过主机名或IP地址得到InetAdress类
public String getHostAddress();返会ip地址字符串
public String getHostName(); 返回ip地址主机名。

import java.net.InetAddress;
import java.net.UnknownHostException;
public class InetAddressDemo {
    public static void main(String[] args) throws Exception {
        InetAddress address = InetAddress.getByName("192.168.20.25");

        String hostName = address.getHostName();
        System.out.println(hostName);
    }
}

4.Socket编程(网络编程)
a.Socket套接字具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
b.Socket编程机制:
通信双方都有Socket。
网络通信实际就是Socket间的通信。
数据在两个Socket之间进行IO传输。
c.UDP通信
发送步骤:创建UDP发送数据端的Socket对象;创建数据包并给出数据,把数据打包;通过Socket对象发送数据包;释放资源。
接收步骤:创建UDP接收端的Socket对象;创建一个接收数据的数据包;接收数据,将数据放在接收的数据包中;解析数据包,并把数据显示在控制台上;释放资源。

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;

public class UdpClient {
    public static void main(String[] args) throws Exception {
        //1.创建发送端的socket对象
        DatagramSocket ds = new DatagramSocket();

        InetAddress address = InetAddress.getByName("192.168.20.25");
        int port = 9999;

        //2.创建键盘录入对象
        Scanner sc = new Scanner(System.in);
        String line;
        while ((line=sc.nextLine())!=null) {
            //键盘录入的数据line
            byte[] buf = line.getBytes();
            int length = buf.length;
            DatagramPacket dp = new DatagramPacket(buf, length, address, port);
            //发送数据包
            ds.send(dp);
        }

        //释放资源
        ds.close();
    }
}
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdpServer {
    public static void main(String[] args) throws Exception {
        //创建接收端的socket对象
        DatagramSocket ds = new DatagramSocket(9999);

        //接受来自客户端的数据
        while (true) {
            //创建数据包
            byte[] buf = new byte[1024];
            int length = buf.length;
            DatagramPacket dp = new DatagramPacket(buf, length);

            //接受来自客户端的数据
            ds.receive(dp);

        //解析数据包中的数据
            byte[] data = dp.getData();
            int len = dp.getLength();
            System.out.println(new String(data, 0, len));
        }
    }
}

d.TCP通信
发送端:创建TCP底层传输数据Socket对象(指定服务器ip及端口号),如Socket sk = new Socket(“196.168.25.25”,9999);获取输出流,并写入数据,如OutputStream outputStream = sk.getOutputStream();
outputStream.write(“Hello”.getBytes());
释放资源;
接收端:创建TCP协议接收端Socket对象(ServerSocket);监听客户端连接(Socket socket = new ServerSocket().accpet();获取输入流,并读取数据,显示在数据台;释放资源(socket.close())。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class ServerThread implements Runnable{
    private Socket sk;
    public ServerThread(Socket sk){
        this.sk = sk;
    }
    @Override
    public void run() {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream()));
            BufferedWriter bw = new BufferedWriter(new FileWriter(UUIDUtils.getFileName()));

            String line;
            while((line = br.readLine()) != null ){
                bw.write(line);
                bw.newLine();
                bw.flush();
            }

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.print````````
tackTrace();
        }
    }

}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;


/**
 * 2.6  
    需求:客户端读取文本文件中的内容发送给服务端,服务端将内容控制台输出
 *  客户端:
 *  1.读取文本文件,一次读取一行
 *  2.将读取到的内容写入通道,一次写一行
 *  3.释放资源
 *  服务器端:   
 *  1.从通道中读取数据,一次读取一行
 *  2.输出
 */
public class TcpClient {
    public static void main(String[] args) throws Exception {
        Socket sk = new Socket("192.168.20.25", 10010);
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sk.getOutputStream()));
        BufferedReader br = new BufferedReader(new FileReader("a.txt"));

        String line;
        while((line = br.readLine()) != null ){
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        br.close();
        bw.close();
        sk.close();
    }
}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {
    public static void main(String[] args) throws Exception {
        ServerSocket ss = new ServerSocket(10010);
        while(true){
            Socket sk = ss.accept();
            new Thread(new ServerThread(sk)).start();
        }

    }
}
import java.util.UUID;

public class UUIDUtils {

    public static String getFileName(){
        String fileName = UUID.randomUUID().toString();
        fileName = fileName.replaceAll("-", "") + ".txt";
        return fileName;
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值