先启动服务端
再启动客户端,并输入字符 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);
}
}