网络Socket编程TCP协议例子
1.单线程TCP服务端
public class TcpChatServer {
private Integer port=8000;
private ServerSocket serverSocket;
public static void main(String[] args)throws Exception {
new TcpChatServer().service();
}
public TcpChatServer() throws Exception {
//启动一个服务监听一个指定的端口port
serverSocket=new ServerSocket(port);
System.out.println("service started!");
}
private void service(){
while (true) {
Socket socket=null;
try {
//serversocket开始监听服务,客户端和服务端交互的socket
socket=serverSocket.accept();
System.out.println(String.format("client:%s port:%s",socket.getInetAddress(),socket.getPort()));
//获取客户端的数据对象
BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//写入客户端的数据对象
PrintWriter writer=new PrintWriter(socket.getOutputStream(),true);
String word;
while ((word=reader.readLine())!=null) {
//相应请求
writer.println(reply(word));
//如果用户输入bye则退出循环
if(word.equals("bye")){
break;
}
}
} catch (IOException e) {
System.err.println(e.getMessage());
}finally{
//一定要关闭socket
if(socket!=null){
try {
socket.close();
} catch (IOException e) {
System.err.println(e.getMessage());
}
}
}
}
}
//回复相应
private String reply(String word){
return "you said :"+word;
}
}
运行...在cmd下访问....使用telnet访问....


但是有一个问题...如果再开一个telnet访问的话输入什么都是没有效果的...只有等到第一个结束之后才会对第二个访问的telnet进行回复,如下图.

搞一个多线程的Socket服务端.
public class TcpThreadChatServer {
private Integer port=8000;
private ServerSocket serverSocket;
public static void main(String[] args)throws Exception {
new TcpThreadChatServer().service();
}
public TcpThreadChatServer() throws Exception {
//启动一个服务监听一个指定的端口port
serverSocket=new ServerSocket(port);
System.out.println("service started!");
}
private void service(){
while (true) {
Socket socket=null;
try {
//serversocket开始监听服务,客户端和服务端交互的socket
socket=serverSocket.accept();
//对于每次请求,多线程应答 可以开多个可以对多个客户端进行回应.
new Thread(new Worker(socket)).start();
} catch (IOException e) {
System.err.println(e.getMessage());
}
}
}
class Worker implements Runnable{
public Worker(Socket socket) {
this.socket = socket;
}
private Socket socket;
@Override
public void run() {
try {
System.out.println(String.format("client:%s port:%s",socket.getInetAddress(),socket.getPort()));
//获取客户端的数据对象
BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//写入客户端的数据对象
PrintWriter writer=new PrintWriter(socket.getOutputStream(),true);
String word;
while ((word=reader.readLine())!=null) {
//相应请求
writer.println(reply(word));
//如果用户输入bye则退出循环
if(word.equals("bye")){
break;
}
}
} catch (Exception e) {
System.err.println(e.getMessage());
}finally{
if(socket!=null){
try {
socket.close();
} catch (IOException e) {
System.err.println(e.getMessage());
}
}
}
}
}
//回复相应
private String reply(String word){
return "you said :"+word;
}
}
可以开启多个telnet访问 并同时处理反馈.....
可以写对应的如下客户端...通过控制台访问该服务端,不再使用telnet...
public class TcpChatClient {//客户端和服务端通话都是过socket
private Socket socket;
private String host="localhost";//要请求的服务器地址
private Integer port=8000;
public TcpChatClient() throws Exception {
//初始化一个客户端socket
socket=new Socket(host, port);
System.out.println("connect ok!");
}
public static void main(String[] args) throws Exception {
new TcpChatClient().say();
}
private void say() throws Exception {
//两个reader对象
//本地的system.in 的reader
BufferedReader localReader=new BufferedReader(new InputStreamReader(System.in));
//和服务器交互的writer【PrintWriter 的自动flush 功能】 这个ture参数非常重要 .
PrintWriter writer=new PrintWriter(socket.getOutputStream(),true);
//和服务器交互的reader
BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String word;
String readLine;
while ((word=localReader.readLine())!=null){
//请求服务端来获取数据
writer.println(word);
//打印到控制台上
readLine = reader.readLine();
System.out.println(readLine);
//如果用户输入bye则退出循环
if (word.equals("bye")){
socket.close();
break;
}
}
}
}
网络Socket编程TCP协议例子的更多相关文章
- 网络Socket编程UDP协议例子
服务端代码 public class UDPChatServer { //通讯端口 private Integer port=8000; //数据报文的通讯通道对象 private DatagramC ...
- 网络编程——TCP协议、UDP协议、socket套接字、粘包问题以及解决方法
网络编程--TCP协议.UDP协议.socket套接字.粘包问题以及解决方法 TCP协议(流式协议) 当应用程序想通过TCP协议实现远程通信时,彼此之间必须先建立双向通信通道,基于该双向通道实现数 ...
- Java:基于TCP协议网络socket编程(实现C/S通信)
目录 一.前言:TCP原理简介 二.Socket编程通信 三.TCP服务器端(具体代码) 四.TCP客户端(具体代码) 五.通信效果演示 六."创意"机器人:价值一个亿的AI核心代 ...
- 网络编程TCP协议-聊天室
网络编程TCP协议-聊天室(客户端与服务端的交互); <span style="font-size:18px;">1.客户端发数据到服务端.</span> ...
- UDP协议网络Socket编程(java实现C/S通信案例)
我的博客园:https://www.cnblogs.com/chenzhenhong/p/13825286.html 我的CSDN博客:https://blog.csdn.net/Charzous/a ...
- java多线程实现TCP网络Socket编程(C/S通信)
目录 开篇必知必会 一.多线程技术 二.实现多线程接收 1.单线程版本 2.多线程版本 三.多线程与进程的关系 四.客户端界面完整代码 五.多线程通信对比 最后 开篇必知必会 在前一篇<Java ...
- 网络编程之tcp协议以及粘包问题
网络编程tcp协议与socket以及单例的补充 一.单例补充 实现单列的几种方式 #方式一:classmethod # class Singleton: # # __instance = None # ...
- 卫星网络中使用TCP协议的劣势(所以才有TCP优化版用来卫星通信啊,比如TCP-Peach和ADolar)
卫星网络中使用TCP协议的劣势 为了避免产生网络拥塞,原TCP协议综合采用了慢启动.拥塞避免.快速重传以及快速恢复等算法.但这些算法应用的前提是网络发生拥塞造成丢包,然而在误码率相对较高的卫星通信系统 ...
- 基于网络编程 TCP协议 及 socket 基本语法
socket是什么 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面, ...
随机推荐
- C++STL deque
deque双端数组 deque<int> dq; deque<int>::iterator it; dq.push_back();//尾部插入元素 dq.push_front( ...
- vba遗传算法之非一致性突变
http://www.docin.com/p-959323141-f4.html Sub 非一致性变异() Dim totalGenerate As Integer, currentGenerate ...
- IntelliJ IDEA 2017版 编译器使用学习笔记(八) (图文详尽版);IDE快捷键使用;IDE代码重构(寻找修改痕迹)
git集成: 快速找到版本控制器中某段代码的作者 一.annotate 选中某行代码,右键,选择annotate,鼠标放于其上就会显示注释 二.移动所有改动之处: prev ...
- UVaLive 4628 Jack's socks (贪心)
题意:给定一个无向图,让你把所有点的和它的任意一个相邻点匹配起来,问你是方案是不是唯一,如果是,则输出方案. 析:贪心,很容易知道,如果一个点的度数是 1,那么它只有一个相邻点,这样的话,我们就可以把 ...
- bind研究(一)转载
## 阅读数:6537 最近自学JavaScript,学到bind方法这块儿有些地方不太明白,自己就查了些资料,结合自己的理解写了这篇文章以备后面回顾用...其实应该还是搬砖为主吧. 什么是this对 ...
- TCP、UDP之三次握手四次挥手
1. http协议的简介 HTTP,HyperText Transfer Protocol.超文本传输协议,是互联网上应用最为广泛的一种网络协议.基于TCP的协议,HTTP是一个客户端和服务器端请求和 ...
- 给Java开发者的Scala教程
author:Michel Schinz,Philipp Haller 1. 简介 本文将该要的介绍Scala语言和其编译.这里假设读者已经有一定的java开发经验,需要概要的了解他们可以用Scala ...
- Beta阶段第六篇Scrum冲刺博客-Day5
1.站立式会议 提供当天站立式会议照片一张 2.每个人的工作 (有work item 的ID),并将其记录在码云项目管理中: 昨天已完成的工作. 张晨晨:完善收藏功能 郭琪容:收藏功能的实现 吴玲:完 ...
- OC语言-block and delegate
参考博客 OC语言BLOCK和协议 iOS Block iOS Block循环引用精讲 iOS之轻松上手block 深入浅出Block的方方面面 Block apple官方参考 1.定义一个block ...
- poj3929
题意: 如上图放置的一个圆锥,告诉你从圆锥顶的洞中流出多少体积的水,求现在水面高度.. 思路: 无聊时做的一道题,实际上就是一道高数题,重积分,可惜我高数本来也不好而且还忘光了,积了很久,而且错了很多 ...