新手入門,照着課本敲的,自己加的註釋,若有錯誤,敬請指出。
接着會自己試着寫多線程的、異地交流的一些東東。
前兩個代碼是客戶機發話,服務器傻逼式迴應;後面兩個代碼是客戶機和服務器都是人工的,當線程的,輪流輸入通信。
運行情況:
SERVER:
服務器啓動
New connection accepted/127.0.0.1:2924
1
2
3
4
5
dxgjdfjg
bye]
bye
CLIENT:
How are you ! I am amy . you can talk with me .
1
Amy:YES!
2
Amy:I love you!
3
Amy:I love xiaopan!
4
Amy:Sorry I can't understand you!
5
Amy:Sorry I can't understand you!
dxgjdfjg
Amy:Sorry I can't understand you!
bye]
Amy:Sorry I can't understand you!
bye
Amy:See You!
【SERVER】
package socketserver;
/**
* EchoServer Server program
* can do easy talk with Client
* @author Amy
* make in 2014/2
* @Version 1.0
*/
import java.io.*;
import java.net.*;
public class EchoServer { //服務端程序
private int port = 8000; //鏈接端口
private ServerSocket serverSocket;
public EchoServer() throws IOException { //開啓服務端程序
serverSocket = new ServerSocket(port); //指定通信端口並開啓服務
System.out.println("服務器啓動");
}
public String echo(String msg) { //給恢復信息加前綴
return "Amy:" + msg;
}
private PrintWriter getWriter(Socket socket) throws IOException { //給客戶機回覆交流語句
OutputStream socketOut = socket.getOutputStream();
return new PrintWriter(socketOut, true);
}
private BufferedReader getReader(Socket socket) throws IOException { //用於讀取客戶機交流語句
InputStream scoketIn = socket.getInputStream();
return new BufferedReader(new InputStreamReader(scoketIn));
}
public void server() { //服務程序
Socket socket = null; //清空客戶機連接
try {
socket = serverSocket.accept();// 等待客戶機連接
System.out.println("New connection accepted"
+ socket.getInetAddress() + ":" + socket.getPort()); //客戶機連接成功,給出新連接客戶機IP地址及連接端口號
BufferedReader br = getReader(socket); //讀取客戶機交流語句
PrintWriter pw = getWriter(socket);
pw.println("How are you ! I am amy . you can talk with me ."); //交流問候語
String msg = null; //清空對話緩存內容
while ((msg = br.readLine()) != null) { //讀取客戶機交流語句 若不爲空
System.out.println(msg); //輸出到服務端控制檯
if (msg.equals("bye"))// 如果客戶發送信息爲“bye”,結束通信
{
pw.println(echo("See You!")); //給客戶機恢復對應語句//要結束服務了:下次再見
break; //結束服務 斷開連接
}
else if(msg.equals("1")) //與客戶機交流
{
pw.println(echo("YES!"));
}
else if(msg.equals("2"))
{
pw.println(echo("I love you!"));
}
else if(msg.equals("3"))
{
pw.println(echo("I love xiaopan!"));
}
else
{
pw.println(echo("Sorry I can't understand you!"));
}
}
} catch (IOException e) { //異常
e.printStackTrace();
} finally {
try {
if (socket != null) //客戶機關閉客戶端
socket.close();// 斷開連接
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws IOException { //main
new EchoServer().server();
}
}
【CLIENT】/**
* EchoClient Client program
* can talk with Server
* @author Amy
* make in 2014/2
* @Version 1.0
*/
import java.io.*;
import java.net.*;
import java.util.*;
public class EchoClient { //客戶端
private String host = "localhost"; //與本地服務端器通信
private int port = 8000; //指定通信端口
private Socket socket;
public EchoClient() throws IOException { //與服務端建立連接,收到“問候語”表示連接成功
socket = new Socket(host, port); //與指定的服務器的指定端口連接
}
private PrintWriter getWriter(Socket socket) throws IOException { //給服務端發送回話語句
OutputStream socketOut = socket.getOutputStream();
return new PrintWriter(socketOut, true);
}
private BufferedReader getReader(Socket socket) throws IOException { //接收服務端的會話語句
InputStream socketIn = socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn));
}
public void talk()throws IOException{ //與服務端回話程序
try{
BufferedReader br=getReader(socket); //接收服務端的會話語句
PrintWriter pw=getWriter(socket); //給服務端發送回話語句
BufferedReader localReader=new BufferedReader(new InputStreamReader(System.in));//本地控制檯輸入
String msg=null; //清空語句緩存
System.out.println(br.readLine()); //輸出服務端會話語句到服務檯,連接成功的“問候語句”
while((msg=localReader.readLine())!=null){ //讀取到本地客戶端控制檯語句,不爲空
pw.println(msg); //給服務端發送本地客戶端控制檯輸入的會話語句
System.out.println(br.readLine()); //將接收到的服務端發來的會話語句輸出到本地客戶端控制檯
if(msg.equals("bye"))break;
}
}
catch(IOException e){
e.printStackTrace();
}
finally
{
try{
socket.close(); //斷開連接
}
catch(IOException e){
e.printStackTrace();
}
}
}
public static void main(String[] args) throws IOException{ //main
new EchoClient().talk();
}
}
自主對話:
【Server】
/**
* EchoServer Server program
* user can talk with Client
* @author Amy
* make in 2014/2
* @Version 1.1
*/
import java.io.*;
import java.net.*;
public class EchoServer { //服務端程序
private int port = 8000; //鏈接端口
private ServerSocket serverSocket;
public EchoServer() throws IOException { //開啓服務端程序
serverSocket = new ServerSocket(port); //指定通信端口並開啓服務
System.out.println("服務器啓動");
}
public String echo(String msg) { //給恢復信息加前綴
return "Amy:" + msg;
}
private PrintWriter getWriter(Socket socket) throws IOException { //給客戶機回覆交流語句
OutputStream socketOut = socket.getOutputStream();
return new PrintWriter(socketOut, true);
}
private BufferedReader getReader(Socket socket) throws IOException { //用於讀取客戶機交流語句
InputStream scoketIn = socket.getInputStream();
return new BufferedReader(new InputStreamReader(scoketIn));
}
public void server() { //服務程序
Socket socket = null; //清空客戶機連接
try {
socket = serverSocket.accept();// 等待客戶機連接
System.out.println("New connection accepted"
+ socket.getInetAddress() + ":" + socket.getPort()); //客戶機連接成功,給出新連接客戶機IP地址及連接端口號
BufferedReader br = getReader(socket); //讀取客戶機交流語句
PrintWriter pw = getWriter(socket); //將會話內容發送給客戶端
BufferedReader localReader=new BufferedReader(new InputStreamReader(System.in));//本地控制檯輸入
pw.println("How are you ! I am amy . you can talk with me ."); //交流問候語
String msg = null; //清空對話緩存內容
while ((msg = br.readLine()) != null) { //讀取客戶機交流語句 若不爲空
System.out.println(msg); //輸出到服務端控制檯
if (msg.equals("bye"))// 如果客戶發送信息爲“bye”,結束通信
{
pw.println(echo("See You!")); //給客戶機恢復對應語句//要結束服務了:下次再見
break; //結束服務 斷開連接
}
else
{
msg=localReader.readLine();//讀取本地服務端控制檯內容
pw.println(echo(msg));
}
/*else if(msg.equals("1")) //與客戶機交流
{
pw.println(echo("YES!"));
}
else if(msg.equals("2"))
{
pw.println(echo("I love you!"));
}
else if(msg.equals("3"))
{
pw.println(echo("I love xiaopan!"));
}
else
{
pw.println(echo("Sorry I can't understand you!"));
}*/
}
} catch (IOException e) { //異常
e.printStackTrace();
} finally {
try {
if (socket != null) //客戶機關閉客戶端
socket.close();// 斷開連接
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws IOException { //main
new EchoServer().server();
}
}
【CLIENT】
/**
* EchoClient Client program
* user can talk with Server
* @author Amy
* make in 2014/2
* @Version 1.1
*/
import java.io.*;
import java.net.*;
import java.util.*;
public class EchoClient { //客戶端
private String host = "localhost"; //與本地服務端器通信
private int port = 8000; //指定通信端口
private Socket socket;
public EchoClient() throws IOException { //與服務端建立連接,收到“問候語”表示連接成功
socket = new Socket(host, port); //與指定的服務器的指定端口連接
}
private PrintWriter getWriter(Socket socket) throws IOException { //給服務端發送回話語句
OutputStream socketOut = socket.getOutputStream();
return new PrintWriter(socketOut, true);
}
private BufferedReader getReader(Socket socket) throws IOException { //接收服務端的會話語句
InputStream socketIn = socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn));
}
public void talk()throws IOException{ //與服務端回話程序
try{
BufferedReader br=getReader(socket); //接收服務端的會話語句
PrintWriter pw=getWriter(socket); //給服務端發送回話語句
BufferedReader localReader=new BufferedReader(new InputStreamReader(System.in));//本地控制檯輸入
String msg=null; //清空語句緩存
System.out.println(br.readLine()); //輸出服務端會話語句到服務檯,連接成功的“問候語句”
while((msg=localReader.readLine())!=null){ //讀取到本地客戶端控制檯語句,不爲空
pw.println(msg); //給服務端發送本地客戶端控制檯輸入的會話語句
System.out.println(br.readLine()); //將接收到的服務端發來的會話語句輸出到本地客戶端控制檯
if(msg.equals("bye"))break;
}
}
catch(IOException e){
e.printStackTrace();
}
finally
{
try{
socket.close(); //斷開連接
}
catch(IOException e){
e.printStackTrace();
}
}
}
public static void main(String[] args) throws IOException{ //main
new EchoClient().talk();
}
}