Socket又称套接字,是基于应用服务与TCP/IP通信之间的一个抽象,它是计算机之间进行通信的一种约定或一种方式。通过socket这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。socket是用来连接到因特网的工具。将TCP/IP协议里面的通信逻辑进行分装,只要通过一组简单的API就可以实现网络的链接。

socket中TCP的三次握手建立连接详解
我们知道tcp建立连接要进行“三次握手”,即交换三个分组。大致流程如下:

1.客户端向服务器发送一个SYN J
2.服务器向客户端响应一个SYN K,并对SYN J进行确认ACK J+1
3.客户端再想服务器发一个确认ACK K+1

服务器端先初始化socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器的连接就建立了,客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,最后关闭连接,一次交互结束。

通常服务器在启动的时候都会绑定一个众所周知的地址(如ip地址+端口号),用于提供服务,客户就可以通过它来接连服务器,而客户端就不用指定,有系统自动分配一个端口号和自身的ip地址组合,这就是为什么通常服务器在listen之前会调用bind(),而客户端就不会调用,而是在connect()时由系统随机生成一个

accept的第一个参数为服务器的socket描述字,是服务器开始调用socket()函数生成的,称为监听socket描述字;而accept函数返回的是已连接的socket描述字。一个服务器通常通常仅仅只创建一个监听socket描述字,它在该服务器的生命周期内一直存在。内核为每个由服务器进程接受的客户连接创建了一个已连接socket描述字,当服务器完成了对某个客户的服务,相应的已连接socket描述字就被关闭。

服务器端:

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner; public class Server extends Netutil { public static void main(String[] args) {
new Server().Get();
} /*进入的方法*/
public void Get() {
try {
ServerSocket serverSocket = new ServerSocket(4432);
InetAddress inetAddress = InetAddress.getLocalHost(); // System.out.println("开启服务器");
Socket accept;
while (true) {
accept = serverSocket.accept();
//System.out.println("主机"+accept.getRemoteSocketAddress()+"连接服务器"); Thread hander = new Thread(new Handler(accept));
hander.start(); }
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 内部处理类
*/
class Handler extends Netutil implements Runnable {
Socket socket; public Handler(Socket socket) {
this.socket = socket;
} @Override
public void run() {
try {
super.Oprate(socket);
} catch (IOException e) {
e.printStackTrace();
} }
} }

客户端:

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner; public class Server extends Netutil { public static void main(String[] args) {
new Server().Get();
} /*进入的方法*/
public void Get() {
try {
ServerSocket serverSocket = new ServerSocket(4432);
InetAddress inetAddress = InetAddress.getLocalHost(); // System.out.println("开启服务器");
Socket accept;
while (true) {
accept = serverSocket.accept();
//System.out.println("主机"+accept.getRemoteSocketAddress()+"连接服务器"); Thread hander = new Thread(new Handler(accept));
hander.start(); }
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 内部处理类
*/
class Handler extends Netutil implements Runnable {
Socket socket; public Handler(Socket socket) {
this.socket = socket;
} @Override
public void run() {
try {
super.Oprate(socket);
} catch (IOException e) {
e.printStackTrace();
} }
} }

使用Java实现hello/hi的简单网络聊天程序的更多相关文章

  1. hello/hi的简单的网络聊天程序

    hello/hi的简单的网络聊天程序 0 Linux Socket API Berkeley套接字接口,一个应用程序接口(API),使用一个Internet套接字的概念,使主机间或者一台计算机上的进程 ...

  2. 以您熟悉的编程语言为例完成一个hello/hi的简单的网络聊天程序

    Socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信,应用程序通常通过"套接字"向网络发出 ...

  3. telnet指令研究—以网络聊天程序为例

    一.telnet指令 Telnet取名自Telecommunications和Networks的联合缩写,是早期个人计算机上连接到服务器主机的一个网络指令,由于存在安全问题,现在已经很少被使用.在wi ...

  4. Socket编程实践(3) 多连接服务器实现与简单P2P聊天程序例程

    SO_REUSEADDR选项 在上一篇文章的最后我们贴出了一个简单的C/S通信的例程.在该例程序中,使用"Ctrl+c"结束通信后,服务器是无法立即重启的,如果尝试重启服务器,将被 ...

  5. C#编写简单的聊天程序

    这是一篇基于Socket进行网络编程的入门文章,我对于网络编程的学习并不够深入,这篇文章是对于自己知识的一个巩固,同时希望能为初学的朋友提供一点参考.文章大体分为四个部分:程序的分析与设计.C#网络编 ...

  6. 简单的聊天程序,主要用到的是Socket

    服务端: import java.io.*; import java.net.*; import java.util.*; public class ChatServer { boolean stat ...

  7. Udp实现简单的聊天程序

    在<UDP通讯协议>这篇文章中,简单的说明了Udp协议特征及如何Udp协议传输数据 这里将用Udp协议技术,编写一个简单的聊天程序: //发送端: package com.shindo.j ...

  8. C#编写简单的聊天程序(转)

    这是一篇基于Socket进行网络编程的入门文章,我对于网络编程的学习并不够深入,这篇文章是对于自己知识的一个巩固,同时希望能为初学的朋友提供一点参考.文章大体分为四个部分:程序的分析与设计.C#网络编 ...

  9. 使用Ajax long polling实现简单的聊天程序

    关于web实时通信,通常使用长轮询或这长连接方式进行实现. 为了能够实际体会长轮询,通过Ajax长轮询实现了一个简单的聊天程序,在此作为笔记. 长轮询 传统的轮询方式是,客户端定时(一般使用setIn ...

随机推荐

  1. EasyLogging++学习笔记(1)—— 简要介绍

    对于有开发经验的程序员来说,记录程序执行日志是一件必不可少的事情.通过查看和分析日志信息,不仅可以有效地帮助我们调试程序,而且当程序正式发布运行之后,更是可以帮助我们快速.准确地定位问题.在现在这个开 ...

  2. CSS测试题Ⅱ

    1.如何使用 CSS3 强制换行? A. word-wrap: break-word; B. text-wrap: break-word; C. text-wrap: force; D. text-w ...

  3. PHP 字符串索引问题

    php 通过下标获取的是字节,而不是字符!!!!$str{$i} 获取的是第$i个字节, 而不是第$i 个字符!!!哦 No,准确说是第$i+1个字节,因为下标是从0开始的,并且应该使用 []代替{} ...

  4. 用CSS实现梯形图标

    遇到需要实现如下图标 由图形分析,梯形,平行四边形等都可以由矩形变形而来. 而想要实现梯形,需要进行3D变换,需要使用css3的 perspective属性. 属性 perspective指定了观察者 ...

  5. 查看PublicKeyToken和生成PublicKeyToken

    http://hi.baidu.com/honfei/item/7777500b20d8ff8a02ce1bd2

  6. plupload+上传文件夹

    文件夹数据库处理逻辑 publicclass DbFolder { JSONObject root; public DbFolder() { this.root = new JSONObject(); ...

  7. eclipse运行内存超出

    问题分析: 1:可能是eclipse自身的运行内存不够 2:可能是java中的jre内存不够 修改方法: 1 改eclipse的运行内存 在eclipse.ini文件中 -startupplugins ...

  8. 【java设计模式】-07适配器模式

    适配器模式 定义: 将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 类型: 结构型模式 应用实例: 1.JAVA JDK 1.1 提供 ...

  9. JavaWeb_(Hibernate框架)Hibernate中数据查询语句SQL基本用法

    本文展示三种在Hibernate中使用SQL语句进行数据查询基本用法 1.基本查询 2.条件查询 3.分页查询 package com.Gary.dao; import java.util.List; ...

  10. 【洛谷2053】 [SCOI2007]修车(费用流)

    传送门 洛谷 Solution 考虑把每一个修车工人拆成\(n\)个点,那么考虑令\(id(i,j)\)为第\(i\)个工人倒数第\(j\)次修车. 然后就可以直接跑费用流了!!! 代码实现 /* m ...