首先。我也是一个刚开始学java socket编程。
大家可以来借鉴一点入门级的经验。
先介绍一些基本常识。socket是基于TCP/IP协议的。通过IP协议找到目的主机,在通过TCP协议完成数据链路的联通。然后开始收发数据。(当然,个人理解。若有不对,敬请指正)
socket的输入流是阻塞式的。在没有接受到数据之前会阻塞线程。
在java中
新建一个服务器端socket:
ServerSocket serversocket = new ServerSocket(Port);//指定端口
新建一个客户端socket:
Socket socket = new Socket(“hostname”,PORT);//需要访问的主机IP和端口。
好啦。开始进入主题。
我理解中的socket 1.0:就像是半条水管。为什么说是半条呢?因为。客户端的soket必须要和服务器端的socket进行连接才能进行通信。
看起来是不是很有道理的样子。
然而实际上。在我理解中的socket 2.0是两根半条水管。“我擦,你TM刚刚不是说只有半条,现在尼玛两根半条又是什么鬼!!”。
淡定~~
socket分为输入流和输出流。有进有出嘛~~~进进出出。 吭吭。别想歪了。
socket的输入流和输出流,只有分工合作。才能互不影响。客户端的输入流负责接收服务端的输出流。服务端的输入流负责客户端的输入流。
这里就是说需要用到多线程。
当然如果不用多线程。也不是不可以通信。只不过由于socket的输入流是阻塞式的。他会阻塞线程。所以情况就是只能一发一收。做不到连续发,连续收。
好啦。最终完整版。我理解中的socket 3.0:客户端和服务器端 的socket通过指定IP和端口。进行连接。连接完成。进行收发 socket(数据)。这个socket中包含输入流和输出流。
还是不懂的话。我还是做个好人给你们贴上代码吧。
package Client;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) {
Socket socket=null;
try {
socket = new Socket("localhost",8888);
//客户端 开启两个线程 :输入/输出
ClientInputThread inputThread = new ClientInputThread(socket);
inputThread.start();
ClientOutputThread outputThread = new ClientOutputThread(socket);
outputThread.start();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package Client;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
/*
* inputThread 输入流。等待接受来自服务端的数据
*/
public class ClientInputThread extends Thread {
private Socket socket=null;
InputStream is = null;
InputStreamReader isr = null;
BufferedReader br = null;
public ClientInputThread(Socket socket) {
this.socket = socket;
}
public void run() {
try {
System.out.println("客户端输入流待命...");
while (true) {
//获得字节输入流,并转换成字符流
is = socket.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
String infor = null;
while((infor=br.readLine())!=null){
System.out.println("客户端输入流:收到一条消息--:"+infor);
}
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
socket.shutdownInput();
if (br != null) br.close();
if (isr != null) isr.close();
if (is != null) is.close();
if (socket != null) socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package Client;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;
/*
* 客户端输出流,输出到服务器的信息
*/
public class ClientOutputThread extends Thread {
private Socket socket = null;
private OutputStream os;
private OutputStreamWriter osw;
private BufferedWriter bw;
public ClientOutputThread(Socket socket) {
this.socket = socket;
}
public void run() {
try {
System.out.println("客户端输出流待命...");
//获得字节输出流
os = socket.getOutputStream();
osw = new OutputStreamWriter(os);
bw = new BufferedWriter(osw);
Scanner scanner = new Scanner(System.in);
while(true){
System.out.println("客户端输出流:请输入需要发送的消息");
bw.write(scanner.nextLine());
bw.newLine();
bw.flush();
System.out.println("客户端输出流:发送完成");
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
socket.shutdownOutput();
if(bw!=null) bw.close();
if(osw!=null) osw.close();
if(os!=null) os.close();
if(socket!=null) socket.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
package Server;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
try {
ServerSocket serversocket = new ServerSocket(8888);
Socket socket = null;
System.out.println("服务端即将监听8888端口,等待客户端接入...");
//循环监听
while(true){
socket = serversocket.accept();
System.out.println("服务器端:监听到客户端,分配输出流线程");
ServerOutputThread serverOutputThread = new ServerOutputThread(socket);
serverOutputThread.start();
System.out.println("服务器端:分配输入流线程");
ServerInputThread serverInputThread = new ServerInputThread(socket);
serverInputThread.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
package Server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
public class ServerInputThread extends Thread {
Socket socket = null;
InputStream is = null;
InputStreamReader isr = null;
BufferedReader br = null;
public ServerInputThread(Socket insocket) {
socket = insocket;
}
public void run() {
try {
while(true){
System.out.println("服务器输入流待命...");
// 获得输入流
is = socket.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
String infor = null;
while((infor=br.readLine())!=null){
System.out.println("服务端输入流:收到一条消息--"+infor);
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.shutdownInput();
if (br != null) br.close();
if (isr != null) isr.close();
if (is != null) is.close();
if (socket != null) socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package Server;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
/*
* serverOutputThread
* 服务器输出函数
*
*/
public class ServerOutputThread extends Thread {
Socket socket = null;
private OutputStream os;
private OutputStreamWriter osw;
private BufferedWriter bw;
public ServerOutputThread(Socket outsocket) {
socket = outsocket;
}
public void run() {
try {
System.out.println("服务器输出流待命...");
//获取字节输出流,并转换成字符输出流
os = socket.getOutputStream();
osw = new OutputStreamWriter(os);
bw = new BufferedWriter(osw);
//从键盘输入字符串
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("服务器输出流:请输入要发送的信息:");
bw.write(scanner.nextLine());
bw.newLine();
bw.flush();
System.out.println("服务器输出流:发送完成");
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
socket.shutdownOutput();
if(bw!=null) bw.close();
if(osw!=null) osw.close();
if(os!=null) os.close();
if(socket!=null) socket.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}