java网络编程

小弟刚刚学了java中的网络编程,于是写了一小段代码,如下用的是TCP传输方式,目的是将客户端的输入的小写字母,经过服务端转化变成大写字母后再返回给客户端,虽然基本功能算是实现了,但是为什么在每句话的的末尾有几个“??”(见结果图)号啊?求大神指点。
程序:
import java.net.*;
import java.io.*;
import java.lang.*;
/*TCP传输 需求:客户端发送小写字母给服务端,服务端将小写字母转成大写字母后
再返回给客户端
分析: 源:客户端键盘 目的:服务端ServerSocket*/
//发送端
class TCPS{
public static void main(String[] args) throws Exception{
//创建客户端Socket服务(并指定目的IP和端口).
Socket s = new Socket("10.0.0.5",10008);
//分两步(1,将键盘录入储存到内存当中)客户端键盘录入
InputStream is = System.in;
byte[] buf = new byte[1024];
InputStream sis = s.getInputStream();
OutputStream sos = s.getOutputStream();
int len=is.read(buf);
//(2.将内存中的数据从客户端发送到服务端)获取客户端的IO流对象.
sos.write(buf,0,len);
//接收客户端返回的数据
len = sis.read(buf);
System.out.println(new String(buf,0,len));
is.close();
s.close();
}
}

//服务端
class TCPR{
public static void main(String[] args) throws Exception {
//创建服务端ServerSocket服务(并指定监听端口).
ServerSocket ss = new ServerSocket(10008);
//通过ss获得客户端的套接字
Socket s = ss.accept();
InputStream is = s.getInputStream();
OutputStream os = s.getOutputStream();
//先接收客户端发送过来的数据
byte[] buf = new byte[1024];
int len = is.read(buf);
char[] ch = new String(buf,0,len).toCharArray();
for(int i=0;i<ch.length;i++){
int temp = ch[i]-32;
ch[i] = (char)temp;
}
//再将新的数据返回给客户端.
os.write(new String(ch,0,len).getBytes());
//System.out.println(new String(ch,0,len));
s.close();
ss.close();
}
}
运行结果:

输入的字符串最后存在换行,即\r\n这两个字符。可以在数组中先抹去这两个字符再传送到服务器端。len=len-2就好了。这两个字符\r称为回车符(返回一行开头,ascii:13),\n称为换行符(另起一行,ascii:10)
实际情况却不这么简单,因为不同操作系统对回车解释是不一样的,在windows和MS-DOS下是\r\n,然而在linux、Unix下是\n,MAC OS则是\r,因此需要针对不同平台进行优化。当然了,如果只在window下运行,那大可直接减去2就行了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-09-09
命令行输入时的不可视字符,如回车、换行

把InputStream is = System.in;换成java.util.Scanner,应该可以解决
相似回答