package socketTest;
import java.net.Socket;
import java.net.ServerSocket;
import java.net.InetAddress;
import java.io.OutputStream;
import java.io.InputStream;public class socketTest extends Thread
{
private Socket s;
public socketTest(Socket s)
{
this.s = s;
}
public void run()
{
try
{
OutputStream os = s.getOutputStream();
InputStream is = s.getInputStream();
int data;
while('q' != (data = System.in.read()))
{
os.write(data);
} System.out.println("d");
while(-1 != (data = is.read()))
{
System.out.write(data);
}
os.close();
is.close();
s.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
public static void server()//静态,便于在main里面调用
{
try
{
ServerSocket ss = new ServerSocket(5000);
while(true)
{
Socket s = ss.accept();
new socketTest(s).start();
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
public static void client()
{
try
{
Socket s = new Socket(InetAddress.getByName("127.0.0.1"), 5000);
OutputStream os = s.getOutputStream();
InputStream is = s.getInputStream();
int data;
while(-1 != (data = is.read()))
{
System.out.write(data);
}
System.out.println("out");//打印输出out
while('q' != (data = System.in.read()))
{
os.write(data);
}
os.close();
is.close();
s.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
public static void main(String[] args)
{
if(args.length > 0)
{
server();
}
else
{
client();
}
}
}
这段代码运行之后我分别启动一个服务器和一个客户端
在服务器中输入一串字符之后以q结尾,可是在客户端,却没有运行到打印输出out那句,为什么啊?
难道不是-1吗? while语句里
import java.net.Socket;
import java.net.ServerSocket;
import java.net.InetAddress;
import java.io.OutputStream;
import java.io.InputStream;public class socketTest extends Thread
{
private Socket s;
public socketTest(Socket s)
{
this.s = s;
}
public void run()
{
try
{
OutputStream os = s.getOutputStream();
InputStream is = s.getInputStream();
int data;
while('q' != (data = System.in.read()))
{
os.write(data);
} System.out.println("d");
while(-1 != (data = is.read()))
{
System.out.write(data);
}
os.close();
is.close();
s.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
public static void server()//静态,便于在main里面调用
{
try
{
ServerSocket ss = new ServerSocket(5000);
while(true)
{
Socket s = ss.accept();
new socketTest(s).start();
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
public static void client()
{
try
{
Socket s = new Socket(InetAddress.getByName("127.0.0.1"), 5000);
OutputStream os = s.getOutputStream();
InputStream is = s.getInputStream();
int data;
while(-1 != (data = is.read()))
{
System.out.write(data);
}
System.out.println("out");//打印输出out
while('q' != (data = System.in.read()))
{
os.write(data);
}
os.close();
is.close();
s.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
public static void main(String[] args)
{
if(args.length > 0)
{
server();
}
else
{
client();
}
}
}
这段代码运行之后我分别启动一个服务器和一个客户端
在服务器中输入一串字符之后以q结尾,可是在客户端,却没有运行到打印输出out那句,为什么啊?
难道不是-1吗? while语句里
两边可以通过协商来发送消息,比如说在服务端在发送消息的末尾加上一个换行符,客户端接收到换行符之后就认为接收结束。下面是这种方法的实现代码:服务端:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;public class ServerCase {
private static ServerSocket server;
private static Socket s;
public static void main(String args[]){
try {
// 创建一个服务端口
server = new ServerSocket(8000);
// 等待用户
s = server.accept();
// 处理客户
service(s);
} catch (IOException e) {
System.out.println("等待客户出错!");
e.printStackTrace();
}
}
// 处理用户,比如say hello to the user
public static void service(Socket s){
try {
BufferedReader reader = new BufferedReader( new InputStreamReader(System.in));
BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(s.getOutputStream()));
String hello = reader.readLine();
// 加上换行符,便于客户端确认一句消息
writer.write(hello+"\r\n");
writer.flush();
} catch (IOException e) {
System.out.println("error occured when say hello to user! ");
e.printStackTrace();
}
}
}
客户端:
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.net.UnknownHostException;public class ClientCase {
private static Socket s;
public static void main(String args[]){
try {
// 连接服务器
s = new Socket( "localhost" , 8000);
// 接收服务器端的信息
receive(s);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} private static void receive(Socket s2) {
try {
InputStream in = s.getInputStream();
StringBuffer buf = new StringBuffer();
int n ;
while((n= in.read()) != -1 ){
if(n != 13 ){ // 13 为 换行符"\r"的ascii码
buf.append( ( char) n );
}else{
// 打印接收到的内容,并跳出循环结束程序
System.out.println(buf);
break;
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
此程序的用意是,从服务端接收一行字符串,发送给客户端,客户端即打印这行字符.