先启动服务端
再启动客户端,并输入字符 Student
/*
TCP通讯 客户端
需求:建立一个文本转换服务器
客户端给服务端发送文本,服务端会将文本转成大写再返回给客户端
而且客户端可以不断地进行文本转换,当客户端输入over时,转换结束
分析:
客户端,既然是操作设备上数据,那么就可以使用io技术,并按照io操作规律思考问题
源:键盘录入
目的:网络输出流,而且操作的是文本数据,用字符流Reader
代码中有几个注意点:
1.在while循环中,readLine方法读取的是一行,因为它是将字符读到缓冲区的,到结尾换行符时才返回
所以在读取从服务端返回的socket流时,要有换行符才行
2.在客户端从控制台获取的字符用socket输出流写入缓冲区后要刷新缓冲区,不然可能不会发出去
关缓冲流时bufr是与控制台关联的,而bufwOut是与socket关联的,关了socket后bufwOut也关闭的
[示例]:字符大写转换客户端
*/
import java.net.*;
import java.io.*;
class Demo
{
public static void main(String[] args) throws Exception
{
new TransClient();
}
}
/*
客户端步骤
1.建立服务
2.获取键盘录入
3.将数据发给服务端
4.获取服务端返回的大写数据
5.结束,关资源
由于都是文本数据,可以用字符流,InputStreamReader,再用缓冲
*/
class TransClient //客户端
{
TransClient() throws Exception
{
s.op("客户端启动....");
client();
}
public void client()throws Exception
{
Socket sock = new Socket("192.168.1.3",10093);
//读取键盘
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
//socket输出流,可以将数据发给服务端
BufferedWriter bufwOut = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));
//定义一个socket读取流,用来读取服务端返回的大写字符数据
BufferedReader bufrIn = new BufferedReader(new InputStreamReader(sock.getInputStream()));
String lineCmd= null; //读取控制台字符
String lineServer = null; //读取服务端返回的字符
while(true)
{
lineCmd = bufr.readLine();
if(lineCmd!=null)
{
if(lineCmd.equals("over886"))
{
break;
}
else
{ //将从控制台读取的数据写入socket输出流
bufwOut.write(lineCmd+System.getProperty("line.separator")); //注意一定要换行符
bufwOut.flush(); //注意,必须的
lineServer = bufrIn.readLine();
s.op("从server返回的大写数据:"+lineServer);
}
}
}
bufr.close();//关闭键盘录入
sock.close();
}
}
class s
{
public static void op(Object obj) //打印
{
System.out.println(obj);
}
}
/*
TCP通讯 服务端
将客户端发来的字符转换成大写返回
注意:该例子中出现的问题
1.客户端和服务端都出现莫名的等待,字符也无法输入,
因为ip错误,找不到主机
又因为客户端和服务端都有阻塞式方法,这些方法方法没有读取到换行标记,那么就一直等待
2.数据没有发送出去,数据写入到缓冲区中没有flush刷出去
关于代码的改进:
1.BufferedWriter包装的 socket输出流,sock.getOutputStream()
我们可以用PrintWriter类,它可以接受字符流,也可以接受字节流
并且它的println方法,是带换行符的,并且自动刷新缓冲
那么newLine()和flush()方法可以省略了,很方便
[示例]:字符大写转换服务端
*/
import java.net.*;
import java.io.*;
class Demo
{
public static void main(String[] args) throws Exception
{
new TransServer();
}
}
/*
服务端
源:socket读取流
目的:socket输出流
都是文本字符
*/
class TransServer //服务端
{
TransServer() throws Exception
{
s.op("服务端启动......");
server();
}
public void server() throws Exception
{
ServerSocket serversock = new ServerSocket(10093);
Socket sock = serversock.accept(); //在服务端获取客户端套接字对象
String ip= sock.getInetAddress().getHostAddress();
s.op("来自客户端的IP:"+ip);
//读取socket读取流中的数据
BufferedReader bufrIn = new BufferedReader(new InputStreamReader(sock.getInputStream()));
//目的,socket输出流,将大写数据写入到socket输出流,并发给客户端
BufferedWriter bufwOut = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));
String lineIn =null;
while(true)
{
lineIn = bufrIn.readLine();
if(lineIn!=null)
{ s.op("来自客户端的转换请求:"+lineIn);
bufwOut.write(lineIn.toUpperCase());
bufwOut.newLine(); //System.getProperty("line.separator")
bufwOut.flush(); //注意必须的
}
else
{
break;
}
}
sock.close();
serversock.close();
}
}
class s
{
public static void op(Object obj) //打印
{
System.out.println(obj);
}
}
- 大小: 36.7 KB
- 大小: 32.1 KB
分享到:
相关推荐
Java学习笔记:JavaSe、Spring、JVM、MySQL、MyBatis...
ORACLE学习笔记:日常应用、深入管理、性能优化.part1
Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记
Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习...
Java I/O学习笔记: 磁盘操作 字节操作 字符操作 对象操作 网络操作 NIO & AIO Java I/O Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,意味着可以在不同的操作系统上运行...
Java基础 java学习笔记 Java Java基础Markdown学习笔记,可转换成PDF、Word等格式
Java项目学习笔记: SSM实战项目——Java高并发秒杀API,详细流程+学习笔记
java学习笔记java学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记.zipjava学习笔记...
Java字符串学习笔记,比较系统的讲解了Java的字符串知识
java学习笔记,java基础知识,只用于个人学习。
java学习笔记.doc java学习笔记 java学习 学习笔记 java
JAVA学习笔记JAVA学习笔记JAVA学习笔记JAVA学习笔记JAVA学习笔记JAVA学习笔记JAVA学习笔记JAVA学习笔记JAVA学习笔记
(完整版)最全的java学习笔记(必看).pdf
java鬼混笔记:JAVA发邮箱(带附件)
Java JDK 5.0学习笔记:TP312JA L393.iso 随书光盘,欢迎大家下载 大家共享^A^
Java Swing组件:Jlist学习笔记Java Swing组件:Jlist学习笔记
C程序学习第一天学习笔记:使用虚拟机基础编译,进制转换,注意事项。
学习笔记:C#图片转换为ico
在学习java过程中的笔记。
Java 虚拟机学习笔记: Java 内存区域, 垃圾收集, 内存分配与回收策略, JVM 调优, 文件结构, 类加载机制, Java 程序 Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,...