TCP通信
1.0 客戶端的實作

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class TCPSocket {
public static void main(String[] args) throws IOException {
Socket socket=new Socket("127.0.0.1",8888);
OutputStream stream = socket.getOutputStream();
stream.write("你好服務器".getBytes());
InputStream inputStream = socket.getInputStream();
byte []bytes=new byte[1024];
int read = inputStream.read(bytes);
System.out.println(new String(bytes,0,read));
socket.close();
}
}
2.0 服務器代碼實作


import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket=new ServerSocket( 8888 );
Socket socket = serverSocket.accept();
InputStream stream = socket.getInputStream();
byte bytes[]=new byte[1024];
int read = stream.read(bytes);
System.out.println(new String(bytes,0,read));
OutputStream outputStream = socket.getOutputStream();
outputStream.write("謝謝收到!".getBytes());
socket.close();
serverSocket.close();
}
}
3.0 TCP通信的綜合案例(上傳檔案從客戶端到服務器,并且存盤到服務器的硬碟中)
客戶端實作

import java.io.*;
import java.net.Socket;
public class TCPSocket {
public static void main(String[] args) throws IOException {
FileInputStream fis=new FileInputStream("D:\\photos\\白雪公主.jpg");
Socket socket=new Socket("127.0.0.1",8888);
OutputStream outputStream = socket.getOutputStream();
byte []bytes=new byte[1024];
int len=0;
while((len=fis.read(bytes))!=-1)
{
outputStream.write(bytes,0,len);
}
socket.shutdownOutput();
/*
*上傳完檔案,給服務器寫一個結束標記
* 禁用此套接字的輸出流
* 對于TCP套接字,任何之前的寫入的資料都將被發送,
* 并且后跟TCP的正常連接終止序列
* */
InputStream inputStream = socket.getInputStream();
byte []bytes1=new byte[1024];
int len1=inputStream.read(bytes1);
System.out.println(new String(bytes1,0,len1));
socket.close();
fis.close();
}
}

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer{
public static void main(String[] args) throws IOException {
ServerSocket serverSocket=new ServerSocket(8888);
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
File file=new File("D:\\upload");
if(!file.exists())
{
file.mkdirs();
}
FileOutputStream fos=new FileOutputStream(file+"\\白雪公主.jpg") ;
byte[] bytes=new byte[1024];
int len=0;
while((len=inputStream.read(bytes))!=-1)
{
fos.write(bytes,0,len);
}
socket.getOutputStream().write("上傳成功!".getBytes());
serverSocket.close();
fos.close();
socket.close();
}
}

函式式介面
1.0 概念

2.0利用Lambda運算式的執行延遲(介面作為方法的引數傳遞)
優化日志的案例(輸入編號,輸出字串拼接后的字串 先字串拼接后執行 所以可能會浪費資源)

public interface MessageBuilder {
public abstract String bulidMessage();
}
public class Main{
public static void main(String[] args) {
String msg1="Hello";
String msg2="World";
String msg3="Java";
showlog(1,()->msg1+msg2+msg3
);
}
private static void showlog(int grade,MessageBuilder ms) {
if(grade==1)
{
System.out.println(ms.bulidMessage());
}
}
}
3.0 介面作為方法的回傳值傳遞
陣列排序案例
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Comparator;
public class Main{
public static Comparator<String> getCompare()
{
return new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o2.length()-o1.length();//長度降序
}
};
}
public static void main(String[] args) {
String arr[]={"jin,27","jimin,25","v,25"};
Arrays.sort(arr,(o1,o2)->o2.length()-o1.length());
System.out.println(Arrays.toString(arr));
}
}
列印結果:
[jimin,25, jin,27, v,25]
常用的函式式介面
1.0 Supplier介面

練習 找出陣列中的最大值 并列印
import java.util.function.Supplier;
public class Main{
public static int getMax(Supplier<Integer> sup)
{
Integer integer = sup.get();
return integer;
}
public static void main(String[] args) {
int Max = getMax(() -> {
int arr[] = {34, 234, 52, 5, 65};
int max = arr[0];
for (int i : arr) {
if (i > max) max = i;
}
return max;
});
System.out.println(Max);//234
}
}
2.0 Consumer介面

import java.util.function.Consumer;
public class Main {
public static void conSume(String name, Consumer<String> con)
{
con.accept(name);
}
public static void main(String[] args) {
conSume("金泰亨",(name)->{
System.out.println(name);
});
}
}
默認方法 andThen
練習 格式化列印資訊 格式 姓名:XX,年齡:XX
import java.util.function.Consumer;
public class Main {
public static void conSume(String []arr, Consumer<String> con1,Consumer<String> con2)
{
for (String s : arr) {
con1.andThen(con2).accept(s);
}
}
public static void main(String[] args) {
String arr[]={"Suga,26","Jimin,25","JK,23"};
conSume(arr,(s)->{
String s1 = s.split(",")[0];
System.out.print("姓名:"+s1+",");
},(s)->{
String s2 = s.split(",")[1];
System.out.println("年齡:"+s2);
});
}
}
列印結果:
姓名:Suga,年齡:26
姓名:Jimin,年齡:25
姓名:JK,年齡:23
3.0 predicate介面
基本使用

import java.util.function.Predicate;
public class Main{
public static void CheckString(String s, Predicate<String> pre)
{
System.out.println(pre.test(s));//false
}
public static void main(String[] args) {
String s="abcde";
CheckString(s,(str)->{
return s.length()>5;
});
}
}
默認方法 and

import java.util.function.Predicate;
public class Main{
public static void checkString(String s, Predicate<String> pre1,Predicate<String> pre2)
{
boolean test = pre1.and(pre2).test(s);
System.out.println(test);
}
public static void main(String[] args) {
String s="abcdef";
checkString(s,(str)->
str.length()>5
,(str)->str.contains("a")
);
}
}
默認方法 or

默認方法 negate

4.0 Function介面
練習將String->Integer+10 Integer->String
import java.util.function.Function;
public class Main{
public static void Method(String s, Function<String,Integer> fun1,Function<Integer,String> fun2)
{
String apply = fun1.andThen(fun2).apply(s);
System.out.println(apply);
}
public static void main(String[] args) {
String s="23";
Method(s,(str)->{
int i = Integer.parseInt(s);
return i+10;
},(i)->{
return i+"";
});
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/152922.html
標籤:Java
