Socket

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

Socket是TCP/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通讯的更多相关文章

  1. Java Scoket编程

    Java Scoket编程 一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位, ...

  2. java socket通讯(二)处理多个客户端连接

    通过java socket通讯(一) 入门示例,就可以实现服务端和客户端的socket通讯,但是上一个例子只能实现一个服务端和一个客户端之间的通讯,如果有多个客户端连接服务端,则需要通过多线程技术来实 ...

  3. Java Scoket之java.io.EOFException解决方案

    Java Scoket之java.io.EOFException解决方案   Socket接收数据的时候,常常会抛出java.io.EOFException异常,也没有明确的原因和提示,在网上搜搜,很 ...

  4. 简单的Java串口通讯应答示例

    java串口通讯第一次使用,找的资料都比较麻烦,一时没有理出头绪,自己在示例的基础上整理了一个简单的应答示例,比较简陋,但演示了java串口通讯的基本过程. package com.garfield. ...

  5. Java Socket通讯---网络基础

    java socket 通讯 参考慕课网:http://www.imooc.com/learn/161 一.网络基础知识 1.1 通讯示意图 1.2 TCP/IP协议 TCP/IP是世界上应用最为广泛 ...

  6. Java线程通讯方法之wait()、nofity() 详解

    Java线程通讯方法之wait().nofity() 详解 本文将探讨以下问题: synchronized 代码块使用 notify()与notifyAll()的区别 Java wait(),noti ...

  7. java socket通讯(一) 入门示例

    一.入门 要想学习socket通讯,首先得知道tcp/ip和udp连接,具体可参考浅谈TCP/IP 和 UDP的区别 二.示例 首先新建了一个java工程,包括两个部分,客户端SocketClient ...

  8. Java 远程通讯技术及原理分析

    在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI.MINA.ESB.Burlap.Hessian.SOAP.EJB和JMS等,这些 ...

  9. Java多播通讯框架 JGroups(转)

    JGroups是一个可靠的群组通讯Java工具包.它基于IP组播(IP multicast),但在可靠性,组成员管理上对它作了扩展. JGroups的可靠性体现在: 1,对所有接收者的消息的无丢失传输 ...

随机推荐

  1. 6.03-news_xpath2

    import re import requests # 安装支持 解析html和XML的解析库 lxml # pip install lxml from lxml import etree url = ...

  2. Cglib动态代理实现方式

    Cglib动态代理实现方式 我们先通过一个demo看一下Cglib是如何实现动态代理的. 首先定义个服务类,有两个方法并且其中一个方法用final来修饰. public class PersonSer ...

  3. UVA1354-Mobile Computing(二进制枚举子集)

    Problem UVA1354-Mobile Computing Accept:267  Submit:2232 Time Limit: 3000 mSec  Problem Description ...

  4. P2360 地下城主(BFS)

    感觉这道题还是蛮简单的,不过使使用了4个队列(其实只是一个)emmmmm,还是很好的 #include<iostream> #include<string> #include& ...

  5. Python2 处理 Unicode 字符串的规则

    在 Python2 中处理 Unicode 字符串,需遵循如下规则: 1. 程序中的字符串要加前缀 u 2. 不要用 str(),而应该用 unicode() 作为字符串转换函数.不要使用 chr() ...

  6. web_ui各种元素的操作

    一:元素在最下方,需要拉动滚动条才可显示 1.js中没有xpath定位元素的方法,只有id.tagname,name 2.在python中用这个方法实现 全部显示是这样的 二:针对区域划分,这里有很多 ...

  7. Python实现机器人聊天

    今天午休的时候,无意之中看了一篇博客,名字叫Python实现机器人,感觉挺有的意思的.于是用其写了一个简单的Python聊天,源码如下所示: # -*- coding: utf- -*- import ...

  8. git branch 分支操作

    一.git分支命令 Git鼓励大量使用分支: 查看分支:git branch 创建分支:git branch <name> 切换分支:git checkout <name> 创 ...

  9. Python网络爬虫实战:根据天猫胸罩销售数据分析中国女性胸部大小分布

    本文实现一个非常有趣的项目,这个项目是关于胸罩销售数据分析的.是网络爬虫和数据分析的综合应用项目.本项目会从天猫抓取胸罩销售数据,并将这些数据保存到SQLite数据库中,然后对数据进行清洗,最后通过S ...

  10. java中scanner的正确用法

    Scanner s = new Scanner(System.in); int choice = 0; if(s.hasNextInt()) { choice = s.nextInt(); } s.c ...