分为客户端和服务端,分别进行收发操作
##########################################################################
客户端:
###思路:
1、建立tcp客户端服务
    1.1因为是面向连接,必须有连接才有通信
    1.2在创建客户端时,就必须明确目的地址和端口
2、一旦连接建立,就有了传输数据的通道。就可以在通道中进行数据传输,这个传输是通过流实现的,是socket  io流
3、获取socket  io中的写动作就可以发送给服务端

###步骤:
1、创建socket对象,明确目的IP和端口
2、通过socket对象的getOutStream方法获取OutputStream对象
3、通过OutputStream对象写数据,实现发送
4、关闭socket对象

###代码:
System.out.println("client start");
//1、创建客户端对象,明确目的和端口
Socket s = new Socket("192.168.10.141",10000);
//2、获取socket流中的输出流,将数据发送给服务端
OutputStream out = s.getOutputStream();
//3、通过输出流写数据
out.write("I miss you".getBytes());
//4、关闭资源
s.close();

####################################################################
服务端:
###思路:
1、创建socket服务器端服务。服务器监听一个端口
2、获取客户端对象
3、获取客户端的socket流的读取流
4、显示

###步骤:
1、创建ServerSocket服务器对象
2、通过ServerSocket对象的accept方法,获取客户端socket对象
3、通过客户端socket对象的getInetAddress().getHostAddress()   方法获取ip对象然后获取ip
4、通过客户端socket对象的getInputStream方法获取InputStream对象
5、通过InputStream对象的read方法获取客户端发送的数据。
6、关闭客户端socket对象。

###代码:
System.out.println("服务器启动。。。");
//1、创建服务器端对象
ServerSocket ss = new ServerSocket(10003);
//2、获取客户端对象
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"...connect");
//3、通过客户端对象获取socket流的读取流
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
String str = new String(buf,0,len);
System.out.println(str); s.close();

################################################################################
简单互动的TCP通讯

/*###
* 案例二:实现客户端和服务端的收发过程。
* 客户端
*/
System.out.println("客户端2 启动.......");
// 创建客户端socket对象。明确服务端地址和端口。
Socket s = new Socket("192.168.1.223", 10004);
// 发送数据,通过socket输出流完成。
OutputStream out = s.getOutputStream();
out.write("服务端,我来了".getBytes());
// 读取服务端返回的数据,通过socket输入流
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
String text = new String(buf,0,len);
System.out.println(text);
// 关闭资源。
s.close();
/*###
* 案例二:实现客户端和服务端的收发过程。 服务器端。
*/
System.out.println("服务端2启动.....");
// 创建tcp服务端socket 明确端口。
ServerSocket ss = new ServerSocket(10004);
while (true) {
// 获取客户端对象。
Socket s = ss.accept();
System.out.println(s.getInetAddress().getHostAddress()
+ ".....connected");
// 读取客户端的发送过来的数据
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
String text = new String(buf, 0, len);
System.out.println(text);
// 给客户端回馈数据。
OutputStream out = s.getOutputStream();
out.write("客户端,我已到收到,哦耶!".getBytes());
// 关闭客户端
s.close();
}
// 关闭服务端。如果不断的获取客户端,不用关闭服务端。
// ss.close();

###########################################################################
我想写一个可以多次发送信息的程序,没有找到哪里错了

public class TCPServer2
{
public static void main(String[] args) throws IOException
{
ServerSocket ss = new ServerSocket(10005);
Socket s = ss.accept();
ServerReceive sr = new ServerReceive(s);
ServerSend ssend = new ServerSend(s);
new Thread(sr).start();
new Thread(ssend).start();
}
} class ServerSend implements Runnable{
private Socket s;
private OutputStream os;
public ServerSend(Socket s) throws IOException {
super();
this.s = s;
os = s.getOutputStream();
} @Override
public void run()
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
try {
while((line = br.readLine()) != null){ os.write(line.getBytes()); if("//over".equals(line)){
break;
}
}
s.close();
} catch (IOException e) {
}
}
} class ServerReceive implements Runnable{
private Socket s;
private InputStream is;
public ServerReceive(Socket s) throws IOException {
super();
this.s = s;
is = s.getInputStream();
} @Override
public void run()
{
while(true){
byte[] buf = new byte[1024];
try {
int len = is.read(buf);
String str = new String(buf,0,len);
if("//over".equals(str)){
break;
}
System.out.println(str);
s.close();
} catch (IOException e) {
}
}
}
}

TCPServer

public class TCPClient2
{
public static void main(String[] args) throws UnknownHostException, IOException
{
Socket bothSocket = new Socket("127.0.0.1",10005);
Send2 send = new Send2(bothSocket);
Receive2 receive = new Receive2(bothSocket); new Thread(send).start();
new Thread(receive).start(); }
} //创建发送和接收的类,使用多线程,继承runnable接口
//多线程发送类
class Send2 implements Runnable{
private Socket s;
OutputStream os;
public Send2(Socket s) throws IOException {
super();
this.s = s;
os = s.getOutputStream();
}
@Override
public void run()
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
try {
while((line = br.readLine()) != null){ os.write(line.getBytes()); if("//over".equals(line)){
break;
}
}
s.close();
} catch (IOException e) {
}
}
} //多线程接收类
class Receive2 implements Runnable{
private Socket s; private InputStream is;
public Receive2(Socket s) throws IOException {
super();
this.s = s;
} @Override
public void run()
{
while(true){
byte[] buf = new byte[1024];
try {
is = s.getInputStream();
int len = is.read(buf);
String str = new String(buf,0,len);
if("//over".equals(str)){
break;
}
System.out.println(str);
s.close();
} catch (IOException e) {
}
}
}
}

TCPClient

026.3 网络编程 TCP聊天的更多相关文章

  1. 026.2 网络编程 UDP聊天

    实现,通过socket对象 ##############################################################需求建立UDP发送端:###思路:1.建立可以实 ...

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

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

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

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

  4. 32.网络编程TCP/UDP服务

    网络编程TCP: 服务器端口了解: port:0~65535 web服务:80 邮箱服务:556 0~1024:为服务默认的公认端口,一般我们不能用 套接字:socket socket作用 ip:po ...

  5. GO语言练习:网络编程 TCP 示例

    1.代码 2.编译及运行 1.网络编程 TCP 示例 simplehttp.go 代码 package main import ( "net" "os" &qu ...

  6. C#网络编程TCP通信实例程序简单设计

    C#网络编程TCP通信实例程序简单设计 采用自带 TcpClient和TcpListener设计一个Tcp通信的例子 只实现了TCP通信 通信程序截图: 压力测试服务端截图: 俩个客户端链接服务端测试 ...

  7. Socket网络编程(TCP/IP/端口/类)和实例

    Socket网络编程(TCP/IP/端口/类)和实例 原文:C# Socket网络编程精华篇 转自:微冷的雨 我们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念: TCP/IP层次 ...

  8. Socket网络编程-TCP编程

    Socket网络编程-TCP编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.socket介绍 1>.TCP/IP协议 2>.跨网络的主机间通讯 在建立通信连接的 ...

  9. 网络编程TCP/IP详解

    网络编程TCP/IP详解 1. 网络通信 中继器:信号放大器 集线器(hub):是中继器的一种形式,区别在于集线器能够提供多端口服务,多口中继器,每个数据包的发送都是以广播的形式进行的,容易阻塞网络. ...

随机推荐

  1. 【C#】组件分享:FormDragger窗体拖拽器

    适用:.net2.0+ winform项目 介绍: 类似QQ.迅雷等讲究UI体验的软件,都支持在窗口内多处地方拖动窗口,而不必老实巴交的去顶部标题栏拖,这个组件就是让winform也能这样随性拖拽,随 ...

  2. 撩课-Web大前端每天5道面试题-Day21

    1.对async.await的理解,内部原理? ①async---声明一个异步函数: 自动将常规函数转换成promise,返回值也是一个promise对象, 只有async函数内部的异步操作执行完,才 ...

  3. when coding in a fresh system

    I have designed a component of a web system with my workmate. In detail, I am just a coder instead o ...

  4. HDU2612(KB1-N)

    Find a way Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. 从敲入 URL 到浏览器渲染完成、对HTTP协议的理解

    1. 大致过程 当你这样子回答的时候: 用户输入 url 地址,浏览器查询 DNS 查找对应的请求 IP 地址 建立 TCP 连接 浏览器向服务器发送 http 请求,如果服务器段返回以 301 之类 ...

  6. mysqli返回受影响行数

    参考链接:http://php.net/manual/en/mysqli.affected-rows.php /* update rows */ $mysqli->query("UPD ...

  7. 地图的可视化--Folium

    1.安装folium pip install MarkupSafe-0.23-cp34-none-win_amd64.whl pip install Jinja2-2.8-py2.py3-none-a ...

  8. intent调用代码总结

    进入联系人界面 Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(People.CO ...

  9. ZZCMS8.2 用户密码重置漏洞

    前言 一个找回密码处的逻辑漏洞, 还是有点意思的. 正文 首先是定位找回密码功能对应的代码位置,使用找回密码的功能,然后抓包即可 下面去 getpassword.php 里面看看, 首先包含了一些文件 ...

  10. C#Owin auth20开发 OwinStartup 不会触发的解决办法

    在使用owin auth20设置token时候遇到一个问题.项目中已经存在如下初始化配置类 using Microsoft.Owin; using Owin; [assembly: OwinStart ...