连接过程:
 
根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
(1)服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
(2)客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
(3)连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
socket连接过程图解
 

demo:
 
 
Client客户端:
import java.io.*;
import java.net.Socket;
import java.util.Scanner; /**
* Created by Administrator on 2017/6/27.
* 客户端
*/
public class Client {
public static void main(String[] args) {
Socket socket = null;
OutputStream os = null;
//PrintWriter pw = null;
Scanner scanner = null;
InputStream is = null;
BufferedReader br = null;
try {
//创建客户端Socket,指定服务器地址和端口
socket = new Socket("localhost", 8888);
//获取输出流,向服务器发送信息
os = socket.getOutputStream();//字节输出流
// pw = new PrintWriter(os);//将输出流包装为打印流
// pw.write("用户名:cw,密码:0813");
// pw.flush();
System.out.println("客户端,请输入多个字符:");
scanner = new Scanner(System.in);
String str = scanner.next();
os.write(str.getBytes());
os.flush();
//socket.shutdownInput(); //获取输入流,并读取服务器端的响应信息
// is = socket.getInputStream();
// br = new BufferedReader(new InputStreamReader(is));
// String info = null;
// while ((info = br.readLine()) != null) {
// System.out.println("服务器:" + info);
// info=br.readLine();
// }
} catch (Exception e) {
e.printStackTrace();
} finally {
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
} if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
} if (scanner != null) {
scanner.close();
} /* if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
} if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}*/ }
}
}

Server服务器端:

import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/** * Created by Administrator on 2017/6/27. * 基于TCP协议的Socket通信,实现用户登陆 * 服务器端 */
public class Server {
public static void main(String[] args) {
try{
//创建一个服务器端Socket,指定并监听端口
ServerSocket serverSocket=new ServerSocket(8888);
Socket socket=null; int count =0;
System.out.println("*****服务器即将启动,等待客户端的连接*****");
//循环监听等待客户端的连接
while(true){
//调用accept()方法开始监听,等待客户端的连接
socket = serverSocket.accept();
//创建一个线程
ServerThread serverThread=new ServerThread(socket);
//启动线程
serverThread.start();
count++;
System.out.println("客户端的数量:"+count);
InetAddress address = socket.getInetAddress();
System.out.println("当前客户端的IP:"+address.getHostAddress()); }
}catch (Exception e){
e.printStackTrace(); }
}
}
 
ServerThread线程:

连接过程:

根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
(1)服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
(2)客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
(3)连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
socket连接过程图解 demo: Client客户端: import java.io.*;
import java.net.Socket;
import java.util.Scanner; /**
* Created by Administrator on 2017/6/27.
* 客户端
*/
public class Client {
public static void main(String[] args) {
Socket socket = null;
OutputStream os = null;
//PrintWriter pw = null;
Scanner scanner = null;
InputStream is = null;
BufferedReader br = null;
try {
//创建客户端Socket,指定服务器地址和端口
socket = new Socket("localhost", 8888);
//获取输出流,向服务器发送信息
os = socket.getOutputStream();//字节输出流
// pw = new PrintWriter(os);//将输出流包装为打印流
// pw.write("用户名:cw,密码:0813");
// pw.flush();
System.out.println("客户端,请输入多个字符:");
scanner = new Scanner(System.in);
String str = scanner.next();
os.write(str.getBytes());
os.flush();
//socket.shutdownInput(); //获取输入流,并读取服务器端的响应信息
// is = socket.getInputStream();
// br = new BufferedReader(new InputStreamReader(is));
// String info = null;
// while ((info = br.readLine()) != null) {
// System.out.println("服务器:" + info);
// info=br.readLine();
// }
} catch (Exception e) {
e.printStackTrace();
} finally {
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
} if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
} if (scanner != null) {
scanner.close();
} /* if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
} if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}*/ }
}
} Server服务器端: import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/** * Created by Administrator on 2017/6/27. * 基于TCP协议的Socket通信,实现用户登陆 * 服务器端 */
public class Server {
public static void main(String[] args) {
try{
//创建一个服务器端Socket,指定并监听端口
ServerSocket serverSocket=new ServerSocket(8888);
Socket socket=null; int count =0;
System.out.println("*****服务器即将启动,等待客户端的连接*****");
//循环监听等待客户端的连接
while(true){
//调用accept()方法开始监听,等待客户端的连接
socket = serverSocket.accept();
//创建一个线程
ServerThread serverThread=new ServerThread(socket);
//启动线程
serverThread.start();
count++;
System.out.println("客户端的数量:"+count);
InetAddress address = socket.getInetAddress();
System.out.println("当前客户端的IP:"+address.getHostAddress()); }
}catch (Exception e){
e.printStackTrace(); }
}
} ServerThread线程: import java.io.*;
import java.net.Socket;
import java.util.Scanner; /**
* Created by Administrator on 2017/6/27.
* 服务器线程处理类
*/
public class ServerThread extends Thread {
//和本线程相关的Socket
Socket socket = null; public ServerThread(Socket socket) {
this.socket = socket;
} //线程执行的操作,响应客户端的请求2
@Override
public void run() {
InputStream is = null;
InputStreamReader isr = null;
BufferedReader br = null;
OutputStream os = null;
//PrintWriter pw = null;
Scanner scanner = null;
try {
System.out.println("*****线程****");
//获取输入流,并读取客户端信息
is = socket.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
String info = null;
while ((info = br.readLine()) != null) {//循环读取客户端信息
System.out.println("来自客户端:" + info);
br.readLine();
}
// socket.shutdownInput(); //socket.shutdownInput(); //获取输出流,响应服务端的请求
os = socket.getOutputStream();
System.out.println("服务器,请输入多个字符:");
scanner = new Scanner(System.in);
String str = scanner.next();
os.write(str.getBytes()); // os.flush();
// pw = new PrintWriter(os);
//pw.write("elcome!");
// pw.flush(); } catch (Exception e) {
e.printStackTrace();
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
} if (isr != null) {
try {
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
} if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
} if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
} if (scanner != null) {
scanner.close();
} if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
 
 
 
 
 
 
 
 

Socket实现服务器与客户端的交互的更多相关文章

  1. 实现服务器和客户端数据交互,Java Socket有妙招

    摘要:在Java SDK中,对于Socket原生提供了支持,它分为ServerSocket和Socket. 本文分享自华为云社区<Java Socket 如何实现服务器和客户端数据交互>, ...

  2. C#调用接口注意要点 socket,模拟服务器、客户端通信 在ASP.NET Core中构建路由的5种方法

    C#调用接口注意要点   在用C#调用接口的时候,遇到需要通过调用登录接口才能调用其他的接口,因为在其他的接口需要在登录的状态下保存Cookie值才能有权限调用, 所以首先需要通过调用登录接口来保存c ...

  3. socket,模拟服务器、客户端通信

    服务器代码: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;u ...

  4. 基于asp.net MVC 的服务器和客户端的交互(一)

    架构思想 三层架构 提出了一种基于ASP.NET开发方式的三层架构的Web应用系统构造思想.其基本内容是:将面向对象的UML建模与Web应用系统开发 相结合,将整个系统分成适合ASP.NET开发方式的 ...

  5. Socket通信——服务器和客户端相互通信

    所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络发出请求或者应答网络请求.  Socket和S ...

  6. Linux系统编程(34)—— socket编程之TCP服务器与客户端的交互

    前面几篇中实现的client每次运行只能从命令行读取一个字符串发给服务器,再从服务器收回来,现在我们把它改成交互式的,不断从终端接受用户输入并和server交互. /* client.c */ #in ...

  7. java socket 单服务器多客户端实时通信

    想用JAVA做一个服务器,请问怎么利用TCP和线程,实现多个客户端同时在线,能与服务器进行交互? 服务器监听端口 做个无限循环 接到一个连接就创建一个通道线程,并将通道线程存储到一个list集合中 1 ...

  8. 基于asp.net MVC 的服务器和客户端的交互(三)之客户端请求响应

    一.分析 WEB API 中HTTP 请求方式的四个主要方法 (GET, PUT, POST, DELETE), 按照下列方式映射为 CURD 操作: GET 用于获取 URI 资源的进行展示,GET ...

  9. 基于asp.net MVC 的服务器和客户端的交互(二)之获取Oauth 2.0认证权限

    基本Web API的ASP.NET的Oauth2认证 增加Token额外字段 增加Scope授权字段 持久化Token 设计Token的时间间隔 刷新Token后失效老的Token 自定义验证[重启I ...

随机推荐

  1. C/C++服务器开发的必备利器–libconfig

    http://www.leoox.com/?p=311 程序肯定需要一份配置文件,要不然,自己的程序不是“可配置”的,自己都不好意思往“高大上”靠拢.言归正传,以前自己写代码,配置文件的读写都是各式各 ...

  2. 我对NHibernate的感受(4):令人欣喜的Interceptor机制

    之前谈了NHibernate的几个方面,似乎抱怨的居多,不过这次我想谈一下我对Interceptor的感受,则基本上都是好话了.这并不一定是说Interceptor设计的又多么好(事实上它使用起来还是 ...

  3. JAVA自定义注解SpringAOP

    原文:https://my.oschina.net/wangnian/blog/801348 前言:Annotation(注解)是JDK5.0及以后版本引入的,它的作用就是负责注解其他注解.现在开发过 ...

  4. cout的输出格式初探

    在C++中,cout代表的是标准输出设备,即显示器,相对于C语言中所使用的printf函数,cout显得更为灵活.下面以30.300和1024三个数为例子,简单说明cout输出时所选格式的输出.cou ...

  5. 【BZOJ】【2435】【NOI2011】道路修建

    DFS/DP 本来以为是一道傻逼题,然而跪了好久……一直RE…… 直接dfs就好了……x->y val=c  :  ans+=abs(n-size[y]-size[y])*c; 然而为啥会一直R ...

  6. leetcode笔记:Same Tree

    一. 题目描写叙述 Given two binary trees, write a function to check if they are equal or not. Two binary tre ...

  7. 用Spark查询HBase中的表数据

    java代码如下: package db.query; import org.apache.commons.logging.Log; import org.apache.commons.logging ...

  8. spring中ApplicationContextAware接口使用理解

    一.这个接口有什么用?当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean.换句话说,就是这个类可以直 ...

  9. [5] 柱台(Cylinder)图形的生成算法

    顶点数据的生成 bool YfBuildCylinderVertices ( Yreal topRadius, Yreal bottomRadius, Yreal height, Yuint slic ...

  10. SQL锁(转)

    说 明    Chaos 无法改写隔离级别更高的事务中的挂起的更改.   ReadCommitted 在正在读取数据时保持共享锁,以避免脏读,但是在事务结束之前可以更改数据,从而导致不可重复的读取或幻 ...