JAVA Socket基础(简单实现)

Posted 前进路上

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA Socket基础(简单实现)相关的知识,希望对你有一定的参考价值。

学习Socket需要了解的几个概念:

Socket 指的是互联网连接中的各个终结点。互联网连接是怎么创建的,通过IP地址加端口号,进行互通。

A电脑(192.168.3.125:80)》》》》B电脑(192.168.3.111:80)   那么这一个个的Ip地址+端口号就是一个Socket(套接字。)

Http协议:两台互联网的通讯需要遵守统一的应用层协议,通常指Http协议。应用层协议还有FTP协议,SMPT简单邮件协议等。

底层协议:IP/TCP协议。除了http需要遵守,还需要遵守IP/TCP协议。

URL: 应用层协议+IP地址+端口号+资源路径    例如  http://www.baidu.com/index.html;   (http协议默认遵守的端口号为80)    文件传输默认为21    远程登录Telnet 23

 

Java中提供的支持Socket操作的几个常用类:

InetAddress :就是表示IP地址啦,没有构造函数。可以用过静态方法InetAddress.getLocalhost()等方法来或者本机的InetAddress对象。toString方法就是打印IP地址。其他方法请参见api文档。

URL: 资源对象。   就是上面所说的URL对象。

Socket:send方法,getOutPutStream()  getInputStream()等

DatagramSocket:数据包,UDP传输保存数据的类。

 

IP/TCP传输:有序,规则,稳定安全。但速度较慢。

服务端:

 

package tcp_ip;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * tcp/ip传输  服务器端
 * @author Administrator
 *
 */

public class Server {
    public static void main(String[] args) throws IOException {
        //创建服务器端socket
        ServerSocket serverSocket = new ServerSocket(9999);
        //创建指定端口的serverSocket后  设置监听状态! 会阻塞
        System.out.println("socket服务端启动成功!正在监听9999端口......");
        Socket socket = serverSocket.accept();
        //成功接收到请求后会返回一个socket
        InputStream is = socket.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader reader = new BufferedReader(isr);
        String data = reader.readLine();
        while(data!=null&&!data.equals("")){
            System.out.println(data);
            data=reader.readLine();
        }
        reader.close();
        isr.close();
        is.close();
        socket.close();
        
    }
}

 

客户端:

 

package tcp_ip;

import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class Client {
    public static void main(String[] args) throws Exception {
        //创建client客户端指定目标ip及端口 (即目标socket)
        Socket socket = new Socket("localhost", 9999);
        //或者这个socket的输出流
        OutputStream outputStream = socket.getOutputStream();
        OutputStreamWriter writer = new OutputStreamWriter(outputStream);
        writer.write("我是客户端,我发送给你的内容是"+"你好啊!服务端!");
        writer.close();
        outputStream.close();
        socket.close();
    }
}

 

//多线程版本:

服务端:

 

package tcp_ip;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerThread {
    public static void main(String[] args) throws IOException {
        //创建服务器端socket
        ServerSocket serverSocket = new ServerSocket(9999);
        //创建指定端口的serverSocket后  设置监听状态! 会阻塞
        System.out.println("socket服务端启动成功!正在监听9999端口......");
        
        while(true){
            Socket socket = serverSocket.accept();
            new RunThread(socket).start();
        }
    }
}

 

 

客户端:

package tcp_ip;

import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class Client {
    public static void main(String[] args) throws Exception {
        //创建client客户端指定目标ip及端口 (即目标socket)
        Socket socket = new Socket("localhost", 9999);
        //或者这个socket的输出流
        OutputStream outputStream = socket.getOutputStream();
        OutputStreamWriter writer = new OutputStreamWriter(outputStream);
        writer.write("我是客户端,我发送给你的内容是"+"你好啊!服务端! 又给你发啦~~");
        writer.close();
        outputStream.close();
        socket.close();
    }
}

 

 

UDP传输:无序,不规则,不安全,速度快。

服务端:

 

package udp;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

/**
 * udp客户端
 * @author Czt
 * 
 */
public class Client {
    public static void main(String[] args) {
        try {
            String data=new String("你好啊!----来自客户端的消息!".getBytes(),"utf-8");
            DatagramPacket datagramPacket = new DatagramPacket(data.getBytes(),data.length(),InetAddress.getLocalHost(),7788);
            DatagramSocket socket = new DatagramSocket();
            socket.send(datagramPacket);
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
}

 

客户端:

 

package udp;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

/**
 * udp客户端
 * @author Czt
 * 
 */
public class Client {
    public static void main(String[] args) {
        try {
            String data=new String("你好啊!----来自客户端的消息!".getBytes(),"utf-8");
            DatagramPacket datagramPacket = new DatagramPacket(data.getBytes(),data.length(),InetAddress.getLocalHost(),7788);
            DatagramSocket socket = new DatagramSocket();
            socket.send(datagramPacket);
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
}

 

以上是关于JAVA Socket基础(简单实现)的主要内容,如果未能解决你的问题,请参考以下文章

golang代码片段(摘抄)

java代码实现socket接口通讯(堵塞I/O)

java socket实现服务端,客户端简单网络通信。Chat

Java中Socket 实现最简单的客户端与服务端通信

Java中Socket 实现最简单的客户端与服务端通信

Java网络编程基础— 基于TCP的NIO简单聊天系统