Java——scoket通讯

Posted 入坑的读书人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java——scoket通讯相关的知识,希望对你有一定的参考价值。

Socket

网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket

 

 

SocketTCP/IP协议通信的抽象层,所以我们还需要了解TCP协议

 

传输层协议

  1. TCP:面向连接,经历三次握手,优点是传输可靠(保证数据正确性,保证数据的顺序)、用于传输大量数据(流模式);缺点就是速度慢,建立连接需要开销较多的时间与系统资源。

  2. UDP:面向非连接、传输不可靠丢包(数据丢失)、用于传输少量数据(数据包模式)、速度快。

 

补充:所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。

 三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息.在socket编程中,客户端执行connect()时。将触发三次握手。

 

下面我们来实现以下服务器与客户端之间的通讯:

 

服务器:Server.class

package sc_test;

import java.io.BufferedWriter;

import java.io.DataOutputStream;

import java.io.IOException;

import java.io.OutputStreamWriter;

import java.net.ServerSocket;

import java.net.Socket;

 

public class Server {

 

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

ServerSocket server =new ServerSocket(8888); //创建服务器 指定端口

System.out.println("服务器已经创建 等待客户端。。。");

Socket socket =server.accept(); //接收客户端的连接

System.out.println("一个客户端建立连接");

 

//发送数据

String msg ="欢迎连接服务器";

//输出流

//输出 方法一

// BufferedWriter bwriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

//

// bwriter.write(msg);

// bwriter.newLine();

// bwriter.flush();

 

//输出 方法二

DataOutputStream dos = new DataOutputStream(socket.getOutputStream());

dos.writeUTF(msg);

dos.flush();

}

}

 

客户端:Client.class

package sc_test;

 

import java.io.BufferedReader;

import java.io.DataInputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.net.Socket;

import java.net.UnknownHostException;

 

public class Client {

 

public static void main(String[] args) throws UnknownHostException, IOException {

 

Socket client = new Socket("localhost",8888); //创建客户端,必须指定服务器+端口 建立连接

 

//接收数据

// BufferedReader br= new BufferedReader(new InputStreamReader(client.getInputStream()));

// String echo = br.readLine(); //阻塞式方法

 

//对应的方法二

DataInputStream dis = new DataInputStream(client.getInputStream());

String echo = dis.readUTF();

System.out.println(echo);

}

}

 

实验结果:

打开服务器线程,出现以下,进入阻塞状态,等待客户端连接如下:

 服务器已经创建 等待客户端。。。

然后运行客户端程序,接收到服务器发送给客户端的信息如下:

 欢迎连接服务器

服务器接收打印信息如下:

服务器已经创建 等待客户端。。。
一个客户端建立连接

 

以上是关于Java——scoket通讯的主要内容,如果未能解决你的问题,请参考以下文章

Linux 进程间通讯详解一

Socket编程简述

用JAVA设计一个通讯录,保存读者信息。

java-- 多线程之间实现通讯

Java企业微信开发_03_通讯录同步

网络--三种网络通讯方式及Android的网络通讯机制