一、服务端代码
import java.net.ServerSocket;
import java.net.Socket;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
/**
* Description:
* 实现一个Socket服务端
* @author Lee
* */
public class Server {
/**
* Description:
* 实现一个Socket服务端
* */
public static void test1(){
ServerSocket server = null;
Socket client = null;
PrintWriter output = null;
Scanner input = null;
Scanner keyboard = null;
try{
//以指定的端口创建一个Socket服务端
server = new ServerSocket(12000);
while(true){
//获取一个Socket客户端实例
client = server.accept();
//获取客户端的IP地址,连接端口
System.out.println("已经连接上"+client.getInetAddress()
+"客户端,端口为:"+client.getPort());
//监听客户端的输入
input = new Scanner(client.getInputStream());
//监听客户端的输出
output = new PrintWriter(client.getOutputStream());
//监听服务端的键盘输入
keyboard = new Scanner(System.in);
//readLine 要等待换行符才会终止,因此只有当客户端输入的字符中换行符才会结束读取完数据
/*
A line is considered to be terminated by any one
of a line feed ('\n'), a carriage return ('\r'), or a carriage return
followed immediately by a linefeed.
*/
// BufferedReader re = new BufferedReader(new InputStreamReader(input));
// String line = null;
// while((line=re.readLine())!=null){
// System.out.println("client:"+line);
// }
//同样的Scanner当没有遇到换行符的时候,会缓存所有读取的数据,当结束程序的时候则会释放出来。
/*
it may buffer all of the input searching for the line to skip
if no line separators are present
*/
//等待客户端的输入
while(input.hasNext()){
System.out.println("CLIENT:"+input.nextLine());
//读取键盘输入
String line = "";
System.out.print("SERVER:");
if(keyboard.hasNext()){
line =keyboard.nextLine();
//将键盘输入的内容输出给客户端
output.println(line);
output.flush();
}
}
}
}catch(IOException e){
e.printStackTrace();
}finally{
//关闭资源
try{
server.close();
client.close();
input.close();
output.close();
keyboard.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
test1();
}
}
二、客户
import java.net.Socket;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.io.InputStream;
import java.util.Scanner;
import java.io.OutputStream;
import java.io.FileInputStream;
import java.io.PrintWriter;
import java.io.InputStreamReader;
import java.io.InterruptedIOException;
import java.io.BufferedReader;
* Description:
* 实现一个Socket客户端
* @author Lee
* */
public class Client {
/**
* Description:
* 实现一个Socket客户端
* */
public static void test1(){
Socket server = null;
PrintWriter output = null;
Scanner input = null;
Scanner keyboard = null;
try{
server = new Socket();
//连接远程服务端
server.connect(new InetSocketAddress("192.168.20.59",12000));
//获取远程服务端的IP地址和端口
System.out.println("已经连接上"+server.getInetAddress()
+"服务端,端口为:"+server.getPort());
//监听输出流
output = new PrintWriter(server.getOutputStream());
//监听输入流
input = new Scanner(server.getInputStream());
//监听键盘的输入流
keyboard = new Scanner(System.in);
//等待键盘输入
System.out.print("CLIENT:");
while(keyboard.hasNext()){
String line = keyboard.nextLine();
/* 源码:
public void print(String s) {
if (s == null) {
s = "null";
}
write(s);
}
public void println() {
newLine();
}
public void println(boolean x) {
synchronized (lock) {
print(x);
println();
}
}
private void newLine() {
try {
synchronized (lock) {
ensureOpen();
//这里加上了换行符,因此readLine才能够完成读取
out.write(lineSeparator);
if (autoFlush)
out.flush();
}
}
catch (InterruptedIOException x) {
Thread.currentThread().interrupt();
}
catch (IOException x) {
trouble = true;
}
}
*/
//使用readLine方法的时候,是需要换行符在终止读取数据的。
//键盘盘输入的内容输出给服务端
output.print(line+"\n");
//print.println(line);
output.flush();
//等待服务端输入流
if(input.hasNext())
System.out.println("SERVER:"+input.nextLine());
System.out.print("CLIENT:");
}
}catch(IOException e){
e.printStackTrace();
}finally{
//关闭资源
try{
server.close();
output.close();
input.close();
keyboard.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
test1();
}
}
版权声明:本文为qq1131410679原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。