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协议例子的更多相关文章

  1. 网络Socket编程UDP协议例子

    服务端代码 public class UDPChatServer { //通讯端口 private Integer port=8000; //数据报文的通讯通道对象 private DatagramC ...

  2. 网络编程——TCP协议、UDP协议、socket套接字、粘包问题以及解决方法

    网络编程--TCP协议.UDP协议.socket套接字.粘包问题以及解决方法 TCP协议(流式协议) ​ 当应用程序想通过TCP协议实现远程通信时,彼此之间必须先建立双向通信通道,基于该双向通道实现数 ...

  3. Java:基于TCP协议网络socket编程(实现C/S通信)

    目录 一.前言:TCP原理简介 二.Socket编程通信 三.TCP服务器端(具体代码) 四.TCP客户端(具体代码) 五.通信效果演示 六."创意"机器人:价值一个亿的AI核心代 ...

  4. 网络编程TCP协议-聊天室

    网络编程TCP协议-聊天室(客户端与服务端的交互); <span style="font-size:18px;">1.客户端发数据到服务端.</span> ...

  5. UDP协议网络Socket编程(java实现C/S通信案例)

    我的博客园:https://www.cnblogs.com/chenzhenhong/p/13825286.html 我的CSDN博客:https://blog.csdn.net/Charzous/a ...

  6. java多线程实现TCP网络Socket编程(C/S通信)

    目录 开篇必知必会 一.多线程技术 二.实现多线程接收 1.单线程版本 2.多线程版本 三.多线程与进程的关系 四.客户端界面完整代码 五.多线程通信对比 最后 开篇必知必会 在前一篇<Java ...

  7. 网络编程之tcp协议以及粘包问题

    网络编程tcp协议与socket以及单例的补充 一.单例补充 实现单列的几种方式 #方式一:classmethod # class Singleton: # # __instance = None # ...

  8. 卫星网络中使用TCP协议的劣势(所以才有TCP优化版用来卫星通信啊,比如TCP-Peach和ADolar)

    卫星网络中使用TCP协议的劣势 为了避免产生网络拥塞,原TCP协议综合采用了慢启动.拥塞避免.快速重传以及快速恢复等算法.但这些算法应用的前提是网络发生拥塞造成丢包,然而在误码率相对较高的卫星通信系统 ...

  9. 基于网络编程 TCP协议 及 socket 基本语法

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

随机推荐

  1. C的指针和数组

    int i; //定义整型变量i int *p; //定义一个指向int的指针变量p int a[5]; //定义一个int数组a int *p[5]; //定义一个指针数组,其中每个数组元素指向一个 ...

  2. cacti+CentOS6.5

    系统版本:CentOS6.5 软件版本:cacti-0.88f 需要预安装的软件有以下几种,可以通过yum安装全部 yum -y install net-snmp* yum -y install op ...

  3. 怎么让挨着的两input之间没有空隙?

    问题:在写选项卡的时候,用input做点击事件的切换时,两个input之间会有空隙,使用margin/padding为0或者为负数依旧如此  → 解决:我脑慢的最后才想到是空格影响的,呵呵呵.

  4. 好文推荐系列--------(2)GruntJS——重复乏味的工作总会有人做(反正我不做)

    GruntJS 是基于JavaScript的命令行构建工具,它可以帮助开发者们自动化重复性的工作.你可以把它看成是JavaScript下的Make或者Ant.它可以完成诸如精简.编译.单元测试.lin ...

  5. DOS下如何打开程序

    cd c:    #先切回主盘,因为最开始在C:\Users\Administrator这个目录下 cd “指定文件所在的盘:”      #切换到文件所在盘 print "文件目录&quo ...

  6. la3890(半平面交)

    蓝书半平面交例题 #include<iostream> #include<cstring> #include<cmath> #include<cstdio&g ...

  7. Jmeter-连接 MySQL数据库

    一.下载mysql驱动包,mysql各个版本驱动包如下: http://central.maven.org/maven2/mysql/mysql-connector-java/ (上面链接的信息来源于 ...

  8. Shell编程-11-子Shell和Shell嵌套

    目录 什么是子Shell 子Shell产生的途径 Shell脚本调用模式 什么是子Shell     子Shell的概念其实是贯穿整个Shell的,如果想要更好的理解和写Shell脚本则必须要了解子S ...

  9. linux 常用命令(个人记录)

    Linux专家的秘诀:思考-实践-在思考-再实践...linux常用命令:root 管理员用户startx 进入shutdown -h now 立刻关机shutdown -r now 现在重新启动计算 ...

  10. Java Map释放内存置null以及调用clear()的区别

    今天自己在总结map的时候,想到了在释放Map对象空间的时候就有使用过将Map对象置null,也有时候会调用clear()将Map中的数据清除,那么它们都有什么区别呢? Map<Integer, ...