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. java常用设计模式三:原型模式

    在说原型模式之前先说一下浅拷贝和深拷贝的概念 一.浅拷贝和深拷贝 1.浅拷贝 在java中,对象创建后需要有一个引用变量来指向该对象实际的地址空间,也就是说引用变量与对象实体是两个不同的数据体.在Ob ...

  2. 反射List<M> To DataTable|反射IList To DataTable|反射 DataTable To List<M>

    将DataTable集合反射获取 List<M> /// <summary> /// 根据DataTable集合反射获取 List<M> /// </summ ...

  3. 阿里云对象存储oss上传文件夹

    最近公司做工程项目,实现文件夹云存储上传. 网上找了一天,发现网上很多代码都存在相似问题,最后终于找到了一个满足我需求的项目. 工程如下: 这里对项目的大文件传输功能做出分析,怎么实现文件夹上传的,如 ...

  4. leetcode - [6]Binary Tree Postorder Traversal

    Given a binary tree, return the postorder traversal of its nodes' values. For example:Given binary t ...

  5. spring mvc使用ModelAndView时发生No request handling method with name '方法 名' in class [类名]的错误

    我日,下午关于标题错误查了好久,网上啥说法都有, 后来发现是ModelAndView的路径引错了 正确路径应该为: import org.springframework.web.servlet.Mod ...

  6. java基本数据类型与封装类型详解(int和Integer区别)

    int是java提供的8种原始数据类型之一. Java为每个原始类型提供了封装类,Integer是java为int提供的封装类(即Integer是一个java对象,而int只是一个基本数据类型).in ...

  7. 从MS Word到Windows Live Writer

    在做笔记的时候,喜欢使用Word进行排版及插入图片,但是当将笔记发布的时候,一般的网站是不支持直接将Word中的图片进行上传的,此时使用Windows Live Writer是一个不错的选择. 可是, ...

  8. hdu 5050 大数

    http://acm.hdu.edu.cn/showproblem.php?pid=5050 大数模板最大公约数 信kuangbin,能AC #include <cstdio> #incl ...

  9. Mining Twitter Data with Python

    目录 1.Collecting data 1.1 Register Your App 1.2 Accessing the Data 1.3 Streaming 2.Text Pre-processin ...

  10. Python自动化开发 - Django【进阶篇】

    Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行 ...