網絡通訊的三要素:數組
1. IP: 設備的標識服務器
2. 端口號: 進程間共同的標識網絡
3. 傳輸協議:多線程
UDP協議: 面向無鏈接,數據被封裝(在64k之內),不可靠(速度快)。 運用實例: 聊天併發
TCP協議 : 面向鏈接,創建雙方數據通道,須要三次握手,可靠(速度慢)。運用實例: 打電話socket
簡單的說:UDP以包形式發送數據,可是不可靠,可能會丟包。TCP以流形式發送數據,可靠,可是效率慢函數
Socket通訊實際上就是網絡通訊,在通訊雙方兩頭都有socket,以包/流形式發送數據。this
*簡單聊天程序:該案例是PC端和服務器進行通訊
*發和收同時進行,須要用多線程線,一個線程控制發,一個線程控制收
public class book16{
public static void main(String[] args) throws SocketException {
DatagramSocket sendsocket=new DatagramSocket();
DatagramSocket receivesocket=new DatagramSocket(1001); //根據端口來接受
new Thread(new send(sendsocket)).start();
new Thread(new receive(receivesocket)).start();
}
}
class send implements Runnable{
private DatagramSocket ds;
public send( DatagramSocket ds){
this.ds=ds;
}
public void run() {
try{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String s=null;
while((s=br.readLine())!=null) {
if(s.equals("886")){
break;
}
byte[] b=s.getBytes();
//將數據封裝到包裏,除了數據外,還有IP,端口號
DatagramPacket dp=new DatagramPacket(b, b.length,InetAddress.getByName("123.12.2.12"),1001);
ds.send(dp);
}
}
catch (Exception e){
throw new RuntimeException("發送失敗");
}
}
}
class receive implements Runnable{
private DatagramSocket ds;
public receive(DatagramSocket ds){
this.ds=ds;
}
public void run() {
try {
while(true){
byte[] b=new byte[1024];
DatagramPacket dp=new DatagramPacket(b, b.length);
ds.receive(dp); //阻塞式方法
int i=dp.getPort();
String s=dp.getAddress().getHostAddress();
System.out.println(i+"\n"+s);
}
}
catch (Exception e){
throw new RuntimeException("接受失敗");
}
}
}線程
TCP的案例: 發送圖片到服務器
進程
* 客戶端併發傳圖片
public class book16{
public static void main(String[] args) {
try {
//數組含有一個參數即圖片時,大小爲1
if (args.length!=1){
System.out.println("選擇一個jpg格式的圖片");
return ;
}
File f=new File(args[0]); //根據主函數傳值來選定圖片
if(!(f.exists()&&f.isFile())){
System.out.println("文件不存在");
return ;
}
if(!f.getName().endsWith(".jpg")){
System.out.println("文件格式不對");
return ;
}
Socket s=new Socket("123.123.2.123",1001);
FileInputStream fs=new FileInputStream(f);
OutputStream os=s.getOutputStream();
byte[] b=new byte[1024];
int i=0;
while((i=fs.read(b))!=-1) {
os.write(b);
}
s.shutdownOutput();
InputStream is=s.getInputStream();
byte[] B=new byte[1024];
int I=is.read(B);
System.out.println(new String(B,0,I));
fs.close();
s.close();
}
catch (Exception e)
{
// TODO: handle exception
}
}
}
//服務端同時接受多個客戶端,利用線程封裝
public class book16{
public static void main(String[] args) {
try {
ServerSocket ss=new ServerSocket(1001);
while(true){
Socket s=ss.accept();
new Thread( new THREAD(s) ).start();
}
}
catch (IOException e){
}
}
}
class THREAD implements Runnable{ private Socket s; public THREAD(Socket s) { this.s=s; } public void run() { String ip=s.getInetAddress().getHostAddress(); int count=1; try { System.out.println(ip+"連接"); InputStream is=s.getInputStream(); File f=new File(ip+"("+count+")"+".jpg"); while( f.exists() ){ f=new File(ip+(count++)+".jpg"); } FileOutputStream fs=new FileOutputStream(f); byte[] b=new byte[1024]; int i=0; while((i=is.read(b))!=-1){ fs.write(b,0,i); } OutputStream os=s.getOutputStream(); os.write("上傳成功".getBytes()); is.close(); s.close(); } catch (Exception e) { } } }