026.3 网络编程 TCP聊天
分为客户端和服务端,分别进行收发操作
##########################################################################
客户端:
###思路:
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聊天的更多相关文章
- 026.2 网络编程 UDP聊天
实现,通过socket对象 ##############################################################需求建立UDP发送端:###思路:1.建立可以实 ...
- 网络编程TCP协议-聊天室
网络编程TCP协议-聊天室(客户端与服务端的交互); <span style="font-size:18px;">1.客户端发数据到服务端.</span> ...
- 网络编程——TCP协议、UDP协议、socket套接字、粘包问题以及解决方法
网络编程--TCP协议.UDP协议.socket套接字.粘包问题以及解决方法 TCP协议(流式协议) 当应用程序想通过TCP协议实现远程通信时,彼此之间必须先建立双向通信通道,基于该双向通道实现数 ...
- 32.网络编程TCP/UDP服务
网络编程TCP: 服务器端口了解: port:0~65535 web服务:80 邮箱服务:556 0~1024:为服务默认的公认端口,一般我们不能用 套接字:socket socket作用 ip:po ...
- GO语言练习:网络编程 TCP 示例
1.代码 2.编译及运行 1.网络编程 TCP 示例 simplehttp.go 代码 package main import ( "net" "os" &qu ...
- C#网络编程TCP通信实例程序简单设计
C#网络编程TCP通信实例程序简单设计 采用自带 TcpClient和TcpListener设计一个Tcp通信的例子 只实现了TCP通信 通信程序截图: 压力测试服务端截图: 俩个客户端链接服务端测试 ...
- Socket网络编程(TCP/IP/端口/类)和实例
Socket网络编程(TCP/IP/端口/类)和实例 原文:C# Socket网络编程精华篇 转自:微冷的雨 我们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念: TCP/IP层次 ...
- Socket网络编程-TCP编程
Socket网络编程-TCP编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.socket介绍 1>.TCP/IP协议 2>.跨网络的主机间通讯 在建立通信连接的 ...
- 网络编程TCP/IP详解
网络编程TCP/IP详解 1. 网络通信 中继器:信号放大器 集线器(hub):是中继器的一种形式,区别在于集线器能够提供多端口服务,多口中继器,每个数据包的发送都是以广播的形式进行的,容易阻塞网络. ...
随机推荐
- Node.js之Express二
好久没写了,今天看博客,觉得有必要把node.js继续写完,善始善终.原本想着把小崔课堂继续讲下去,由于其他原因也就此耽搁下来,看看以后还有没有机会吧.废话不扯,123开始. 一.Exoress之Re ...
- Hibernate下的增删改查
概述: 关系--对象映射的中间件,属于开源ORM框架,是我们业务逻辑层中的调用数据库的中间件 演变: jdbc---hibernater---mybatis hibernate和mybatis区别? ...
- 【转】解决IDEA新建项目名称为红色
idea如果当前project用了版本控制器,其下面新建的所有的项目默认都是加入到版本控制里面,所以项目名称和文件都是红色的,如图: File-->Settings-->version c ...
- 解决文字和text-decoration:underline下划线重叠问题
一.text-decoration:underline下划线的问题 CSS text-decoration:underline可以给内联文本增加下划线,但是,如果对细节要求较高,就会发现,下划线经常会 ...
- Redis 学习资料目录(Important)
redis学习路线: 以下是整理的学习redis优秀博客和优秀网站 一.原理: 1. redis命令在线操作 http://try.redis.io/ 2. 中文命令解释: Redis 命令参考 - ...
- try,except用法
lst = ["皇阿玛", "皇额娘", "容嬷嬷", "紫薇"] # 模拟for循环 it = lst.__iter_ ...
- python学习之老男孩python全栈第九期_day013知识点总结
# l = [1,2,3]# 索引# 循环 for # list # dic # str # set # tuple # f = open() # range() # enumerate'''prin ...
- PHP中常用的魔术方法
我们在PHP中经常用到魔术方法,像构造方法,析构方法等等魔术变量,下面总结一下一些常用的魔术变量: __construct(),__destruct(),__clone(),__autoload(), ...
- Unity3D 场景切换加载进度条实现
需要三个场景,场景A,场景B,场景C: 场景A:一个按钮,点击加载场景B: 场景B:从A切换到C过度场景,加载进度条: 场景C:目标场景: 创建OnProgress.cs脚本: using Syste ...
- js-数组中查找特定元素并返回所有该元素的索引
//在数组中查找所有出现的x,并返回一个包含匹配索引的数组 function findall(a,x){ var results=[], len=a.length, pos=0; while(pos& ...