连接过程:
 
根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
(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. 使用Bootstrap 3开发响应式网站实践01,前期准备、导航区域等

    "使用Bootstrap 3开发响应式网站实践"系列,将使用Bootstrap 3.2制作一个自适应网站,无论是在电脑.平板,还是手机上,都呈现比较好的效果.在电脑浏览器上的最终效 ...

  2. Eclipse配置mybatis-generator插件的2种方法

    原文:https://blog.csdn.net/u012825737/article/details/79117540 最近在做一个Mybatis的项目,学习到了一个插件mybatis-genera ...

  3. Java Web开发基础(2)-JSP

    上一篇博我粗略的介绍了一下Servlet.粗略是由于博主也刚刚学习这部分的内容,还不是非常懂所以无法讲的非常精细.可是本着二八原则,我还是先继续学习.所以,这篇博客接着JSP的内容.由于.这两个内容关 ...

  4. servlet 3.0特性说明

    Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化 Web 应用的开发 ...

  5. java类与继承的执行顺序

    1.子类 public class TestClassLife extends TestClassLifeSuper { public TestClassLife() { System.out.pri ...

  6. android破解

    1.adb shell dumpsys activity top 能够获取到当前程序的Activity信息 2.1.在invoke-static/invoke-virtual指令他的返回类型是V之后可 ...

  7. OBjective-C:文件管理类NSFileManager

    文件管理类NSFileManager类:对文件进行创建.复制.重命名.删除等,一般不对文件内容进行操作. NSData类和NSMutableData类:相当于数据缓冲区  NSFileManager是 ...

  8. unity opaque sort

    https://docs.unity3d.com/ScriptReference/Rendering.OpaqueSortMode.html unity对opaque的排序 tbdr下不排序 其它由近 ...

  9. iOS开发-plist文件增删改查

    plist第一次看到这个后缀名文件的时候感觉怪怪的,不过接触久了也就习以为常了,plist是Property List的简称可以理解成属性列表文件,主要用来存储串行化后的对象的文件.扩展名为.plis ...

  10. vue-router路由知识补充

    1.render函数 var app = new Vue({ el: '#app', router, render: h => h(App) //新添加的函数操作 }) 我们新加了render: ...