可以一直输入,而不是一问一答:

开两个线程,一个负责收,一个负责发。

1.先运行:

  

package com.zr.javase0825;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner; public class User1 implements Runnable { //String pdd="read";
Socket sock;
//Socket sockC;
public static void main(String[] args) {
User1 u1=new User1(); ServerSocket ssock;
try {
ssock = new ServerSocket(1234);
u1.sock=ssock.accept(); // u1.sockC=new Socket("127.0.0.1",5678); Thread t1=new Thread(u1,"read");
Thread t2=new Thread(u1,"write");
t1.start();
t2.start(); } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } public void read(Socket sock){
try {
BufferedReader buff=new BufferedReader(new InputStreamReader(sock.getInputStream()));
System.out.println("user2:"+buff.readLine()); } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} public void write(Socket sockC){
try {
BufferedWriter buff=new BufferedWriter(new OutputStreamWriter(sockC.getOutputStream()));
BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
String str= bf.readLine();
buff.write(str+"\n");
buff.flush(); } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} @Override
public void run() { if(Thread.currentThread().getName().equals("read"))
while(true)
read(sock);
else
while(true)
write(sock); } }

后运行:

package com.zr.javase0825;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner; public class User2 implements Runnable { //String pdd="read";
Socket sock;
//Socket sockC;
public static void main(String[] args) {
User2 u1=new User2(); //ServerSocket ssock;
try {
//ssock = new ServerSocket(5678);
//u1.sock=ssock.accept(); u1.sock=new Socket("127.0.0.1",1234); Thread t1=new Thread(u1,"read");
Thread t2=new Thread(u1,"write");
t1.start();
t2.start(); } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } public void read(Socket sock){
try {
BufferedReader buff=new BufferedReader(new InputStreamReader(sock.getInputStream()));
System.out.println("user2:"+buff.readLine()); } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} public void write(Socket sockC){
try {
BufferedWriter buff=new BufferedWriter(new OutputStreamWriter(sockC.getOutputStream()));
BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
String str= bf.readLine();
buff.write(str+"\n");
buff.flush(); } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} @Override
public void run() {
Scanner in=new Scanner(System.in);
if(Thread.currentThread().getName().equals("read"))
while(true)
read(sock);
else
while(true)
write(sock); } }

Java学习笔记之基于TCP协议的socket的更多相关文章

  1. 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

    Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...

  2. 基于TCP 协议的socket 简单通信

    DNS 服务器:域名解析 socket 套接字 : ​ socket 是处于应用层与传输层之间的抽象层,也是一组操作起来非常简单的接口(接受数据),此接口接受数据之后,交由操作系统 为什么存在 soc ...

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

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

  4. 基于TCP协议的socket套接字编程

    目录 一.什么是Scoket 二.套接字发展史及分类 2.1 基于文件类型的套接字家族 2.2 基于网络类型的套接字家族 三.套接字工作流程 3.1 服务端套接字函数 3.2 客户端套接字函数 3.3 ...

  5. 基于TCP协议的socket编程

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

  6. 网络编程: 基于TCP协议的socket, 实现一对一, 一对多通信

    TCP协议  面向连接 可靠的 面向字节流形式的 tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端 TCP协议编码流程: 服务器端:                 客户端 实例化对 ...

  7. 闲来无事,写个基于TCP协议的Socket通讯Demo

    .Net Socket通讯可以使用Socket类,也可以使用 TcpClient. TcpListener 和 UdpClient类.我这里使用的是Socket类,Tcp协议. 程序很简单,一个命令行 ...

  8. Java网络编程三--基于TCP协议的网络编程

    ServerSocket对象用于监听来自客户端的Socket连接,如果没有连接,它将一直处于等待状体 Socket accept():如果接收到客户端的连接请求,该方法返回一个与客户端对应Socket ...

  9. Java修炼——基于TCP协议的Socket编程_双向通信_实现模拟用户登录

    首先我们需要客户端和服务器端. 服务器端需要:1.创建ServerSocket对象.2.监听客户端的请求数据.3.获取输入流(对象流)即用户在客户端所发过来的信息.                  ...

随机推荐

  1. [CSS备忘] css3零散

    -webkit-overflow-scrolling:touch;下拉滚动回弹

  2. ViewBag的简单使用

    一,在控制器中写好数据绑定 //通过ID查找出整列的数据            Case.Models.Case theCase = db.Case.Find(id);            View ...

  3. 整体认识flume:Flume介绍、分布式安装、常见问题及解决方案

    问题导读 1.什么是flume? 2.flume包含哪些组件? 3.Flume在读取utf-8格式的文件时会出现解析不了时间戳,该如何解决? Flume是一个分布式.可靠.和高可用的海量日志采集.聚合 ...

  4. Vue.js 组件笔记

    Vue 组件总结笔记 一. 创建组件 1. 使用组件三部曲 ( 创建, 注册, 使用 ) 2. 全局组件:Vue.component('tag', {}); 3. 局部组件: components 属 ...

  5. Sass入门:第四章

    1.加法 加法运算是Sass中运算的一种,在变量或属性中都可以做加法运算.如: .box { width: 20px + 8in; } 编译出来的CSS: .box { width: 788px; } ...

  6. 【C++】最大子列和

    此题来自<数据结构与算法>,书中一共介绍了四种方法,这里贴出两种. 1.分治递归,对本题来说,虽然有更好的算法,但是用此题理解分治算法感觉挺有用 #include <iostream ...

  7. img 鼠标滑上后图片放大,滑下后图片复原

    <style type="text/css">img{ -webkit-transition: ease .2s; transition: ease .2s; -web ...

  8. hdu_5884_Sort(二分+单调队列)

    题目链接:hdu_5884_Sort 题意: 有n个数,每个数有个值,现在你可以选择每次K个数合并,合并的消耗为这K个数的权值和,问在合并为只有1个数的时候,总消耗不超过T的情况下,最小的K是多少 题 ...

  9. hdu_5898_odd-even number(数位DP)

    题目链接:hdu_5898_odd-even number 题意: 给你一个区间,问你这个区间中满足连续的偶数的位数为奇数,连续的奇数的位数是偶数的个数 题解: 设dp[i][j][k][l]为考虑当 ...

  10. 使用Angular构建单页面应用(SPA)

    什么是SPA?看下图就是SPA: 下面说正经的,个人理解SPA就是整个应用只有一个页面,所有的交互都在一个页面完成,不需要在页面之间跳转. 单页面的好处是更快的响应速度,更流畅的用户体验,甚至和桌面应 ...