服务器线程处理类

package demo4;

import java.io.*;
import java.net.Socket; /**
* 服务器线程处理类
* @ClassName ServerThread
* @Author DiYun
* @Version 1.0
**/
public class ServerThread extends Thread { //和 本线程相关的Socket
Socket socket = null; public ServerThread(Socket socket) {
this.socket = socket;
} //线程执行的操作,响应客户端的请求
public void run() {
InputStream inputStream =null;
InputStreamReader inputStreamReader = null;
BufferedReader bufferedReader = null;
OutputStream outputStream = null;
PrintWriter printWriter = null; try {
//3.获取输入流 并读取客户端信息
inputStream = socket.getInputStream();//获取字节流
inputStreamReader = new InputStreamReader(inputStream); //读取字节流
bufferedReader = new BufferedReader(inputStreamReader);//为输入流添入缓冲
String info = null;
while ((info = bufferedReader.readLine()) != null) {
//循环读取客户端信息
System.out.println("我是服务器,客户端说:" + info);
} //关闭输入流
socket.shutdownInput(); //4.获取输出流,响应客户端的请求
outputStream = socket.getOutputStream(); //获取输出流,响应客户端的请求
printWriter = new PrintWriter(outputStream);
printWriter.write("欢迎您!");
printWriter.flush(); //调用flush方法将缓冲输出 } catch (IOException e) {
e.printStackTrace();
} finally {
try {
//5.关闭资源
if (printWriter !=null)
printWriter.close();
if(outputStream !=null)
outputStream.close();
if (bufferedReader !=null)
bufferedReader.close();
if(inputStreamReader !=null)
inputStreamReader.close();
if(inputStream !=null)
inputStream.close();
if(socket !=null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

服务器端代码

package demo4;

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays; /**
* 基于TCP 协议Socket 服务端
* @ClassName Server
* @Author DiYun
* @Version 1.0
**/
public class Server {
public static void main(String[] args) {
try {
//1.创建一个服务端Socket即ServerSocket 指定服务的端口并监听
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = null;
//记录客户端连接的数量
int count = 0;
System.out.println("服务端已经启动,等待客户端连接************************");
while (true) {
//2.调用accept()方法开始监听,等待客户端的连接
socket = serverSocket.accept();
//创建一个新的线程
ServerThread serverThread = new ServerThread(socket);
serverThread.start();
count++; //统计客户端的数量
System.out.println("客户端的数量" + count);
InetAddress inetAddress = socket.getInetAddress();
System.out.println("当前IP地址是:" + inetAddress.getHostAddress());
System.out.println("客户端信息:" + Arrays.toString(inetAddress.getAddress()));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

客户端

package demo4;

import java.io.*;
import java.net.Socket; /**
* 基于CTP 协议的 Socket 客户端
*
* @ClassName Client
* @Author DiYun
* @Version 1.0
**/
public class Client {
public static void main(String[] args) {
try {
//1.创建客户端 Socket 指定服务器地址和端口
Socket socket = new Socket("localhost", 8888);
//2.获取输出流,向服务端发送信息
OutputStream outputStream = socket.getOutputStream();
//将输出流包装为打印流
PrintWriter pw = new PrintWriter(outputStream);
pw.write("用户名:admin 密码: 12346");
pw.flush();
socket.shutdownOutput();//关闭输出流 //3.获取输出流 并读取服务端的响应信息
InputStream inputStream = socket.getInputStream();
//
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String info = null;
while ((info = bufferedReader.readLine()) != null) {
//循环读取客户端信息
System.out.println("我是客户端,服务端说:" + info);
} //4.关闭资源
bufferedReader.close();
inputStream.close(); pw.close();
outputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

注意,必须首先启动服务器再启动客户端

基于TCP协议Socket通信的更多相关文章

  1. python 之网络编程(基于TCP协议Socket通信的粘包问题及解决)

    8.4 粘包问题 粘包问题发生的原因: 1.发送端需要等缓冲区满才发送出去,造成粘包(发送数据时间间隔很短,数据了很小,会合到一起,产生粘包),这样接收端,就难于分辨出来了,必须提供科学的拆包机制. ...

  2. 事件驱动的TCP协议Socket通信

    事件驱动的TCP协议Socket通信 介绍 常规的Socket通信案例一般都是在某个线程中建立连接,然后用一个while(true)循环判断是或否有数据传输,但是这种方法有局限性. 1.收到消息在处理 ...

  3. python中基于tcp协议的通信(数据传输)

    tcp协议:流式协议(以数据流的形式通信传输).安全协议(收发信息都需收到确认信息才能完成收发,是一种双向通道的通信) tcp协议在OSI七层协议中属于传输层,它上承用户层的数据收发,下启网络层.数据 ...

  4. IOS 基于TCP的socket通信详解(原创)

    最近在整理通信层相关知识,这篇文章是边整理边写的,有些地方可能不够准确,还请各位路过的大牛专家指出来.这次整理的socket通信是基于TCP的,实现方式是GCD形式,以下记录的都是些理论知识,方便自己 ...

  5. 基于tcp的socket通信

    # socket # socekt是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,socket其实就是一个门面模式,它 # 把复杂的tcp/ip协议族隐藏在socket接 ...

  6. 为何基于tcp协议的通信比基于udp协议的通信更可靠?

    tcp协议一定是先建好双向链接,发一个数据包要得到确认才算发送完成,没有收到就一直给你重发:udp协议没有链接存在,udp直接丢数据,不管你有没有收到. TCP的可靠保证,是它的三次握手双向机制,这一 ...

  7. 基于TCP的socket通信过程及例子

    Socket也叫套接字,用来实现网络通讯,通过调用系统提供的API,可以和远程的机子传输数据.Socket有很多种协议,而这篇文章主要讨论TCP部分的内容,也就是说后面说的内容主要是指TCP Sock ...

  8. 基于Tcp协议的简单Socket通信实例(JAVA)

    好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~ 今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些网络编程的基础,这里就不提了,只记录最简单易懂实用的东西. ...

  9. Java Web 基础(一) 基于TCP的Socket网络编程

    一.Socket简单介绍 Socket通信作为Java网络通讯的基础内容,集中了异常.I/O流模式等众多知识点.学习Socket通信,既能够了解真正的网络通讯原理,也能够增强对I/O流模式的理解. 1 ...

随机推荐

  1. 题解 SP1716 【GSS3 - Can you answer these queries III】

    \[ Preface \] 没有 Preface. \[ Description \] 维护一个长度为 \(n\) 的数列 \(A\) ,需要支持以下操作: 0 x y 将 \(A_x\) 改为 \( ...

  2. 【题解】P3373 【模板】线段树 2

    线段树解法 好丢脸,这个题做了一下午,调试了三个多小时...... 先讲讲解题思路 既然这里是线段树,就要用到lazy-tag.又有加法又有乘法的话,就要用到两个lazy-tag,分别用数组jia[] ...

  3. Nice to meet you for the first time .Why do I write blog!

    他们说我不修边幅,因为他们没看到我对细节的追求,他们说我技术宅,因为他们看不懂我的悲欢,他们说我无趣,是因为她们不知道,我在让世界变得更有趣,我把误解拿来自黑,我用工作承载兴趣,我是程序员,是用代码编 ...

  4. 《Head first设计模式》之抽象工厂

    抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类. 确保原料的一致 披萨店成功的关键在于新鲜.高质量的原料.要如何确保每家加盟店使用高质量的原料?你打算建造一家生成原料的 ...

  5. vue 入门 ------简单购物车功能实现(全选,数量加减,价格加减)

    简易购物车功能(无任何布局 主要是功能) 数量的加减 商品的总价钱 全选与全不选 删除(全选.价格 受影响) <script src="https://cdn.jsdelivr.net ...

  6. php面试笔记(4)-php基础知识-流程控制

    本文是根据慕课网Jason老师的课程进行的PHP面试知识点总结和升华,如有侵权请联系我进行删除,email:guoyugygy@163.com 在面试中,考官往往喜欢基础扎实的面试者,而流程控制相关的 ...

  7. Samba搭建Linux和Windows文件共享服务

    一.Samba简介 Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成.SMB(Server Messages Block,信息服务块)是一种在局域网上共享 ...

  8. Vue之Vuex的使用

    重点看懂这张图: 重点记住: 1.Mutation 必须是同步函数,即mutations里只能处理同步操作. 2.如果处理的是同步操作可直接commit提交mutations更改state,如果是异步 ...

  9. Vue与React的区别

    对已经了解的内容,做几点介绍,并不全面,后期会不断更新~ React与Vue都是组件化的开发框架,整体功能类似. 一.数据处理模式(单项 or 双向): React推崇单项数据流的处理模式,数据不可以 ...

  10. mysql出现 Unknown column 'Password' in 'field list'

    linux安装了mysql之后初始化密码获取:出现了下面的内容,密码很尴尬,无法用root登录: grep 'temporary password' /var/log/mysqld.log [Note ...